home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr53 / acmalg01.zip / ACM573.FOR < prev    next >
Text File  |  1993-01-01  |  476KB  |  13,868 lines

  1. C     ALGORITHM 573, COLLECTED ALGORITHMS FROM ACM. THIS WORK
  2. C     PUBLISHED IN TRANS. MATH. SOFTWARE, 7(3), PP. 369-383.
  3. C  ALGORITHM 573
  4. C
  5. C  NL2SOL -- AN ADAPTIVE NONLINEAR LEAST-SQUARES ALGORITHM
  6. C
  7. C  AUTHORS = JOHN E. DENNIS, JR., DAVID M. GAY, AND ROY E. WELSCH
  8. C
  9. C  ACM TRANSACTIONS ON MATHEMATICAL SOFTWARE, SEPTEMBER, 1981.
  10. C
  11. C  THIS FILE COMES IN 9 SECTIONS, SEPARATED BY A COMMENT LINE HAVING C
  12. C  IN COLUMN 1 AND SLASHES IN COLUMNS 2-72.  THE FIRST SECTION CON-
  13. C  SISTS OF THESE COMMENTS.  SECTIONS 2-5 CONTAIN SINGLE-PRECISION 1966
  14. C  ANSI STANDARD FORTRAN SOURCE CODE, AND SECTIONS 6-9 ARE DOUBLE-
  15. C  PRECISION VERSIONS OF SECTIONS 2-5.  COMMENTS IN SECTIONS 4 AND 8
  16. C  DESCRIBE AN EASY WAY TO MODIFY THIS CODE FOR USE WITH FORTRAN 77.
  17. C  THE 9 SECTIONS ARE AS FOLLOWS...
  18. C
  19. C     1. THESE COMMENTS.
  20. C     2. SINGLE-PREC. SHORT TEST PROGRAM.
  21. C     3. SINGLE-PREC. MACHINE-DEPENDENT FUNCTIONS IMDCON AND RMDCON.
  22. C     4. SINGLE-PREC. MACHINE-INDEPENDENT NL2SOL MODULES.
  23. C     5. SINGLE-PREC. LONG TEST PROGRAM.
  24. C     6. DOUBLE-PREC. SHORT TEST PROGRAM.
  25. C     7. DOUBLE-PREC. MACHINE-DEPENDENT FUNCTIONS IMDCON AND RMDCON.
  26. C     8. DOUBLE-PREC. MACHINE-INDEPENDENT NL2SOL MODULES.
  27. C     9. DOUBLE-PREC. LONG TEST PROGRAM.
  28. C
  29. C  THE SHORT TEST PROGRAM (SECTIONS 2 AND 6) AMOUNTS TO THE EXAMPLE IN
  30. C  SECTION 3.2 OF THE DESCRIPTION OF TOMS ALGORITHM 573 WITH AN ADDED
  31. C  CALL ON NL2SNO.
  32. C
  33. C  DEPENDING ON THE COMPUTER USED, IT MAY BE NECESSARY TO CHANGE THE
  34. C  DATA STATEMENTS IN SECTIONS 3 AND 7 -- SEE SECTION 3.12 OF THE
  35. C  DESCRIPTION OF TOMS ALGORITHM 573.  (THE VERSION OF RMDCON IN
  36. C  SECTION 3 IS SET FOR CDC COMPUTERS, AND THAT IN SECTION 8 IS SET FOR
  37. C  IBM 360 AND 370 COMPUTERS.)
  38. C
  39. C  THE FIRST THREE MODULES IN SECTIONS 4 AND 8 ARE NL2SOL, NL2SNO, AND
  40. C  NL2ITR.  THE REMAINING MODULES FOLLOW IN ALPHABETICAL ORDER.
  41. C
  42. C  THE LONG TEST PROGRAM (SECTIONS 5 AND 9) RUNS THE TESTS REPORTED IN
  43. C  TABLE II OF THE TOMS PAPER ON NL2SOL.  THIS PROGRAM PRODUCES A
  44. C  ONE-PAGE SUMMARY ON UNIT IMDCON(2) AND DETAILED OUTPUT ON UNIT
  45. C  IMDCON(1).  THE LATTER MAY BE SUPPRESSED BY ARRANGING FOR IMDCON(1)
  46. C  TO RETURN 0.
  47. C
  48. C///////////////////////////////////////////////////////////////////////
  49.       END
  50. C     ***  TEST NL2SOL AND NL2SNO ON MADSEN EXAMPLE  ***                MAD00010
  51.       INTEGER IV(62), UIPARM(1)
  52.       REAL V(147), X(2), URPARM(1)
  53.       EXTERNAL MADR, MADJ
  54.       X(1) = 3.0
  55.       X(2) = 1.0
  56.       IV(1) = 0
  57.       CALL NL2SOL(3, 2, X, MADR, MADJ, IV, V, UIPARM, URPARM, MADR)
  58.       IV(1) = 12
  59.       X(1) = 3.0
  60.       X(2) = 1.0
  61.       CALL NL2SNO(3, 2, X, MADR, IV, V, UIPARM, URPARM, MADR)
  62.       STOP
  63.       END
  64.       SUBROUTINE MADR(N, P, X, NF, R, UIPARM, URPARM, UFPARM)
  65.       INTEGER N, P, NF, UIPARM(1)
  66.       REAL X(P), R(N), URPARM(1)
  67.       EXTERNAL UFPARM
  68.       R(1) = X(1)**2 + X(2)**2 + X(1)*X(2)
  69.       R(2) = SIN(X(1))
  70.       R(3) = COS(X(2))
  71.       RETURN
  72.       END
  73.       SUBROUTINE MADJ(N, P, X, NF, J, UIPARM, URPARM, UFPARM)
  74.       INTEGER N, P, NF, UIPARM(1)
  75.       REAL X(P), J(N,P), URPARM(1)
  76.       EXTERNAL UFPARM
  77.       J(1,1) = 2.0*X(1) + X(2)
  78.       J(1,2) = 2.0*X(2) + X(1)
  79.       J(2,1) = COS(X(1))
  80.       J(2,2) = 0.0
  81.       J(3,1) = 0.0
  82.       J(3,2) = -SIN(X(2))
  83.       RETURN
  84.       END
  85.       INTEGER FUNCTION IMDCON(K)                                        IMD00010
  86. C
  87.       INTEGER K
  88. C
  89. C  ***  RETURN INTEGER MACHINE-DEPENDENT CONSTANTS  ***
  90. C
  91. C     ***  K = 1 MEANS RETURN STANDARD OUTPUT UNIT NUMBER.   ***
  92. C     ***  K = 2 MEANS RETURN ALTERNATE OUTPUT UNIT NUMBER.  ***
  93. C     ***  K = 3 MEANS RETURN  INPUT UNIT NUMBER.            ***
  94. C          (NOTE -- K = 2, 3 ARE USED ONLY BY TEST PROGRAMS.)
  95. C
  96.       INTEGER MDCON(3)
  97.       DATA MDCON(1)/6/, MDCON(2)/8/, MDCON(3)/5/
  98. C
  99.       IMDCON = MDCON(K)
  100.       RETURN
  101. C  ***  LAST CARD OF IMDCON FOLLOWS  ***
  102.       END
  103.       REAL FUNCTION RMDCON(K)                                           RMD00010
  104. C
  105. C  ***  RETURN MACHINE DEPENDENT CONSTANTS USED BY NL2SOL  ***
  106. C
  107. C +++  COMMENTS BELOW CONTAIN DATA STATEMENTS FOR VARIOUS MACHINES.  +++
  108. C +++  TO CONVERT TO ANOTHER MACHINE, PLACE A C IN COLUMN 1 OF THE   +++
  109. C +++  DATA STATEMENT LINE(S) THAT CORRESPOND TO THE CURRENT MACHINE +++
  110. C +++  AND REMOVE THE C FROM COLUMN 1 OF THE DATA STATEMENT LINE(S)  +++
  111. C +++  THAT CORRESPOND TO THE NEW MACHINE.                           +++
  112. C
  113.       INTEGER K
  114. C
  115. C  ***  THE CONSTANT RETURNED DEPENDS ON K...
  116. C
  117. C  ***        K = 1... SMALLEST POS. ETA SUCH THAT -ETA EXISTS.
  118. C  ***        K = 2... SQUARE ROOT OF 1.001*ETA.
  119. C  ***        K = 3... UNIT ROUNDOFF = SMALLEST POS. NO. MACHEP SUCH
  120. C  ***                 THAT 1 + MACHEP .GT. 1 .AND. 1 - MACHEP .LT. 1.
  121. C  ***        K = 4... SQUARE ROOT OF 0.999*MACHEP.
  122. C  ***        K = 5... SQUARE ROOT OF 0.999*BIG (SEE K = 6).
  123. C  ***        K = 6... LARGEST MACHINE NO. BIG SUCH THAT -BIG EXISTS.
  124. C
  125.       REAL BIG, ETA, MACHEP
  126. C/+
  127.       REAL SQRT
  128. C/
  129.       REAL ONE001, PT999
  130. C
  131.       DATA ONE001/1.001/, PT999/0.999/
  132. C
  133. C  +++  IBM 360, IBM 370, OR XEROX  +++
  134. C
  135. C     DATA BIG/Z7FFFFFFF/, ETA/Z00100000/, MACHEP/Z3C100000/
  136. C
  137. C  +++  DATA GENERAL  +++
  138. C
  139. C     DATA BIG/0.7237E+76/, ETA/0.5398E-78/, MACHEP/0.9537E-06/
  140. C
  141. C  +++  DEC 11  +++
  142. C
  143. C     DATA BIG/1.7E+38/, ETA/2.9388E-39/, MACHEP/1.1921E-07/
  144. C
  145. C  +++  HP3000  +++
  146. C
  147. C     DATA BIG/1.1579E+77/, ETA/8.6362E-78/, MACHEP/2.3842E-07/
  148. C
  149. C  +++  HONEYWELL  +++
  150. C
  151. C     DATA BIG/O376777000000/, ETA/O404400400000/,
  152. C    1     MACHEP/O716400000000/
  153. C
  154. C  +++  DEC10  +++
  155. C
  156. C     DATA BIG/"377777777777/, ETA/"000400000021/,
  157. C    1     MACHEP/"147400000000/
  158. C
  159. C  +++  BURROUGHS  +++
  160. C
  161. C     DATA BIG/O0777777777777777/, ETA/O1771000000000000/,
  162. C    1     MACHEP/O1301000000000000/
  163. C
  164. C  +++  CONTROL DATA  +++
  165. C
  166.       DATA BIG/37754000000000000000B/, ETA/00024000000000000000B/,
  167.      1     MACHEP/16414000000000000000B/
  168. C
  169. C  +++  PRIME  +++
  170. C
  171. C     DATA BIG/1.7E+38/, ETA/1.47E-39/, MACHEP/2.38419E-7/
  172. C
  173. C  +++  UNIVAC  +++
  174. C
  175. C     DATA BIG/1.69E+38/, ETA/5.9E-39/, MACHEP/1.4901162E-8/
  176. C
  177. C  +++  VAX  +++
  178. C
  179. C     DATA BIG/1.7E+38/, ETA/2.939E-39/, MACHEP/5.9604645E-08/
  180. C
  181. C-------------------------------  BODY  --------------------------------
  182. C
  183.       GO TO (10, 20, 30, 40, 50, 60), K
  184. C
  185.  10   RMDCON = ETA
  186.       GO TO 999
  187. C
  188.  20   RMDCON = SQRT(ONE001*ETA)
  189.       GO TO 999
  190. C
  191.  30   RMDCON = MACHEP
  192.       GO TO 999
  193. C
  194.  40   RMDCON = SQRT(PT999*MACHEP)
  195.       GO TO 999
  196. C
  197.  50   RMDCON = SQRT(PT999*BIG)
  198.       GO TO 999
  199. C
  200.  60   RMDCON = BIG
  201. C
  202.  999  RETURN
  203. C  ***  LAST CARD OF RMDCON FOLLOWS  ***
  204.       END
  205.       SUBROUTINE NL2SOL(N, P, X, CALCR, CALCJ, IV, V, UIPARM, URPARM,   NL200010
  206.      1                  UFPARM)
  207. C
  208. C  ***  MINIMIZE NONLINEAR SUM OF SQUARES USING ANALYTIC JACOBIAN  ***
  209. C  ***  (NL2SOL VERSION 2.2)  ***
  210. C
  211.       INTEGER N, P, IV(1), UIPARM(1)
  212.       REAL X(P), V(1), URPARM(1)
  213. C     DIMENSION IV(60+P),  V(93 + N*P + 3*N + P*(3*P+33)/2)
  214. C     DIMENSION UIPARM(*), URPARM(*)
  215.       EXTERNAL CALCR, CALCJ, UFPARM
  216. C
  217. C  ***  PURPOSE  ***
  218. C
  219. C        GIVEN A P-VECTOR X OF PARAMETERS, CALCR COMPUTES AN N-VECTOR
  220. C     R = R(X) OF RESIDUALS CORRESPONDING TO X.  (R(X) PROBABLY ARISES
  221. C     FROM A NONLINEAR MODEL INVOLVING P PARAMETERS AND N OBSERVATIONS.)
  222. C     THIS ROUTINE INTERACTS WITH NL2ITR TO SEEK A PARAMETER VECTOR X
  223. C     THAT MINIMIZES THE SUM OF THE SQUARES OF (THE COMPONENTS OF) R(X),
  224. C     I.E., THAT MINIMIZES THE SUM-OF-SQUARES FUNCTION
  225. C     F(X) = (R(X)**T) * R(X) / 2.  R(X) IS ASSUMED TO BE A TWICE CON-
  226. C     TINUOUSLY DIFFERENTIABLE FUNCTION OF X.
  227. C
  228. C--------------------------  PARAMETER USAGE  --------------------------
  229. C
  230. C N........ (INPUT) THE NUMBER OF OBSERVATIONS, I.E., THE NUMBER OF
  231. C                  COMPONENTS IN R(X).  N MUST BE .GE. P.
  232. C P........ (INPUT) THE NUMBER OF PARAMETERS (COMPONENTS IN X).  P MUST
  233. C                  BE POSITIVE.
  234. C X........ (INPUT/OUTPUT).  ON INPUT, X IS AN INITIAL GUESS AT THE
  235. C                  DESIRED PARAMETER ESTIMATE.  ON OUTPUT, X CONTAINS
  236. C                  THE BEST PARAMETER ESTIMATE FOUND.
  237. C CALCR.... (INPUT) A SUBROUTINE WHICH, GIVEN X, COMPUTES R(X).  CALCR
  238. C                  MUST BE DECLARED EXTERNAL IN THE CALLING PROGRAM.
  239. C                  IT IS INVOKED BY
  240. C                       CALL CALCR(N,P,X,NF,R,UIPARM,URPARM,UFPARM)
  241. C                  WHEN CALCR IS CALLED, NF IS THE INVOCATION COUNT
  242. C                  FOR CALCR.  IT IS INCLUDED FOR POSSIBLE USE WITH
  243. C                  CALCJ.  IF X IS OUT OF BOUNDS (E.G. IF IT WOULD
  244. C                  CAUSE OVERFLOW IN COMPUTING R(X)), THEN CALCR SHOULD
  245. C                  SET NF TO 0.  THIS WILL CAUSE A SHORTER STEP TO BE
  246. C                  ATTEMPTED.  THE OTHER PARAMETERS ARE AS DESCRIBED
  247. C                  ABOVE AND BELOW.  CALCR SHOULD NOT CHANGE N, P, OR X.
  248. C CALCJ.... (INPUT) A SUBROUTINE WHICH, GIVEN X, COMPUTES THE JACOBIAN
  249. C                  MATRIX J OF R AT X, I.E., THE N BY P MATRIX WHOSE
  250. C                  (I,K) ENTRY IS THE PARTIAL DERIVATIVE OF THE I-TH
  251. C                  COMPONENT OF R WITH RESPECT TO X(K).  CALCJ MUST BE
  252. C                  DECLARED EXTERNAL IN THE CALLING PROGRAM.  IT IS
  253. C                  INVOKED BY
  254. C                       CALL CALCJ(N,P,X,NF,J,UIPARM,URPARM,UFPARM)
  255. C                  NF IS THE INVOCATION COUNT FOR CALCR AT THE TIME
  256. C                  R(X) WAS EVALUATED.  THE X PASSED TO CALCJ IS
  257. C                  USUALLY THE ONE PASSED TO CALCR ON EITHER ITS MOST
  258. C                  RECENT INVOCATION OR THE ONE PRIOR TO IT.  IF CALCR
  259. C                  SAVES INTERMEDIATE RESULTS FOR USE BY CALCJ, THEN IT
  260. C                  IS POSSIBLE TO TELL FROM NF WHETHER THEY ARE VALID
  261. C                  FOR THE CURRENT X (OR WHICH COPY IS VALID IF TWO
  262. C                  COPIES ARE KEPT).  IF J CANNOT BE COMPUTED AT X,
  263. C                  THEN CALCJ SHOULD SET NF TO 0.  IN THIS CASE, NL2SOL
  264. C                  WILL RETURN WITH IV(1) = 15.  THE OTHER PARAMETERS
  265. C                  TO CALCJ ARE AS DESCRIBED ABOVE AND BELOW.  CALCJ
  266. C                  SHOULD NOT CHANGE N, P, OR X.
  267. C IV....... (INPUT/OUTPUT) AN INTEGER VALUE ARRAY OF LENGTH AT LEAST
  268. C                  60 + P THAT HELPS CONTROL THE NL2SOL ALGORITHM AND
  269. C                  THAT IS USED TO STORE VARIOUS INTERMEDIATE QUANTI-
  270. C                  TIES.  OF PARTICULAR INTEREST ARE THE INITIALIZATION/
  271. C                  RETURN CODE IV(1) AND THE ENTRIES IN IV THAT CONTROL
  272. C                  PRINTING AND LIMIT THE NUMBER OF ITERATIONS AND FUNC-
  273. C                  TION EVALUATIONS.  SEE THE SECTION ON IV INPUT
  274. C                  VALUES BELOW.
  275. C V........ (INPUT/OUTPUT) A FLOATING-POINT VALUE ARRAY OF LENGTH AT
  276. C                  LEAST 93 + N*P + 3*N + P*(3*P+33)/2 THAT HELPS CON-
  277. C                  TROL THE NL2SOL ALGORITHM AND THAT IS USED TO STORE
  278. C                  VARIOUS INTERMEDIATE QUANTITIES.  OF PARTICULAR IN-
  279. C                  TEREST ARE THE ENTRIES IN V THAT LIMIT THE LENGTH OF
  280. C                  THE FIRST STEP ATTEMPTED (LMAX0), SPECIFY CONVER-
  281. C                  GENCE TOLERANCES (AFCTOL, RFCTOL, XCTOL, XFTOL),
  282. C                  AND HELP CHOOSE THE STEP SIZE USED IN COMPUTING THE
  283. C                  COVARIANCE MATRIX (DELTA0).  SEE THE SECTION ON
  284. C                  (SELECTED) V INPUT VALUES BELOW.
  285. C UIPARM... (INPUT) USER INTEGER PARAMETER ARRAY PASSED WITHOUT CHANGE
  286. C                  TO CALCR AND CALCJ.
  287. C URPARM... (INPUT) USER FLOATING-POINT PARAMETER ARRAY PASSED WITHOUT
  288. C                  CHANGE TO CALCR AND CALCJ.
  289. C UFPARM... (INPUT) USER EXTERNAL SUBROUTINE OR FUNCTION PASSED WITHOUT
  290. C                  CHANGE TO CALCR AND CALCJ.
  291. C
  292. C  ***  IV INPUT VALUES (FROM SUBROUTINE DFAULT)  ***
  293. C
  294. C IV(1)...  ON INPUT, IV(1) SHOULD HAVE A VALUE BETWEEN 0 AND 12......
  295. C             0 AND 12 MEAN THIS IS A FRESH START.  0 MEANS THAT
  296. C             DFAULT(IV, V) IS TO BE CALLED TO PROVIDE ALL DEFAULT
  297. C             VALUES TO IV AND V.  12 (THE VALUE THAT DFAULT ASSIGNS TO
  298. C             IV(1)) MEANS THE CALLER HAS ALREADY CALLED DFAULT(IV, V)
  299. C             AND HAS POSSIBLY CHANGED SOME IV AND/OR V ENTRIES TO NON-
  300. C             DEFAULT VALUES.  DEFAULT = 12.
  301. C IV(COVPRT)... IV(14) = 1 MEANS PRINT A COVARIANCE MATRIX AT THE SOLU-
  302. C             TION.  (THIS MATRIX IS COMPUTED JUST BEFORE A RETURN WITH
  303. C             IV(1) = 3, 4, 5, 6.)
  304. C             IV(COVPRT) = 0 MEANS SKIP THIS PRINTING.  DEFAULT = 1.
  305. C IV(COVREQ)... IV(15) = NONZERO MEANS COMPUTE A COVARIANCE MATRIX
  306. C             JUST BEFORE A RETURN WITH IV(1) = 3, 4, 5, 6.  IN
  307. C             THIS CASE, AN APPROXIMATE COVARIANCE MATRIX IS OBTAINED
  308. C             IN ONE OF SEVERAL WAYS.  LET K = ABS(IV(COVREQ)) AND LET
  309. C             SCALE = 2*F(X)/MAX(1,N-P),  WHERE 2*F(X) IS THE RESIDUAL
  310. C             SUM OF SQUARES.  IF K = 1 OR 2, THEN A FINITE-DIFFERENCE
  311. C             HESSIAN APPROXIMATION H IS OBTAINED.  IF H IS POSITIVE
  312. C             DEFINITE (OR, FOR K = 3, IF THE JACOBIAN MATRIX J AT X
  313. C             IS NONSINGULAR), THEN ONE OF THE FOLLOWING IS COMPUTED...
  314. C                  K = 1....  SCALE * H**-1 * (J**T * J) * H**-1.
  315. C                  K = 2....  SCALE * H**-1.
  316. C                  K = 3....  SCALE * (J**T * J)**-1.
  317. C             (J**T IS THE TRANSPOSE OF J, WHILE **-1 MEANS INVERSE.)
  318. C             IF IV(COVREQ) IS POSITIVE, THEN BOTH FUNCTION AND GRAD-
  319. C             IENT VALUES (CALLS ON CALCR AND CALCJ) ARE USED IN COM-
  320. C             PUTING H (WITH STEP SIZES DETERMINED USING V(DELTA0) --
  321. C             SEE BELOW), WHILE IF IV(COVREQ) IS NEGATIVE, THEN ONLY
  322. C             FUNCTION VALUES (CALLS ON CALCR) ARE USED (WITH STEP
  323. C             SIZES DETERMINED USING V(DLTFDC) -- SEE BELOW).  IF
  324. C             IV(COVREQ) = 0, THEN NO ATTEMPT IS MADE TO COMPUTE A CO-
  325. C             VARIANCE MATRIX (UNLESS IV(COVPRT) = 1, IN WHICH CASE
  326. C             IV(COVREQ) = 1 IS ASSUMED).  SEE IV(COVMAT) BELOW.
  327. C             DEFAULT = 1.
  328. C IV(DTYPE).... IV(16) TELLS HOW THE SCALE VECTOR D (SEE REF. 1) SHOULD
  329. C             BE CHOSEN.  IV(DTYPE) .GE. 1 MEANS CHOOSE D AS DESCRIBED
  330. C             BELOW WITH V(DFAC).  IV(DTYPE) .LE. 0 MEANS THE CALLER
  331. C             HAS CHOSEN D AND HAS STORED IT IN V STARTING AT
  332. C             V(94 + 2*N + P*(3*P + 31)/2).  DEFAULT = 1.
  333. C IV(INITS).... IV(25) TELLS HOW THE S MATRIX (SEE REF. 1) SHOULD BE
  334. C             INITIALIZED.  0 MEANS INITIALIZE S TO 0 (AND START WITH
  335. C             THE GAUSS-NEWTON MODEL).  1 AND 2 MEAN THAT THE CALLER
  336. C             HAS STORED THE LOWER TRIANGLE OF THE INITIAL S ROWWISE IN
  337. C             V STARTING AT V(87+2*P).  IV(INITS) = 1 MEANS START WITH
  338. C             THE GAUSS-NEWTON MODEL, WHILE IV(INITS) = 2 MEANS START
  339. C             WITH THE AUGMENTED MODEL (SEE REF. 1).  DEFAULT = 0.
  340. C IV(MXFCAL)... IV(17) GIVES THE MAXIMUM NUMBER OF FUNCTION EVALUATIONS
  341. C             (CALLS ON CALCR, EXCLUDING THOSE USED TO COMPUTE THE CO-
  342. C             VARIANCE MATRIX) ALLOWED.  IF THIS NUMBER DOES NOT SUF-
  343. C             FICE, THEN NL2SOL RETURNS WITH IV(1) = 9.  DEFAULT = 200.
  344. C IV(MXITER)... IV(18) GIVES THE MAXIMUM NUMBER OF ITERATIONS ALLOWED.
  345. C             IT ALSO INDIRECTLY LIMITS THE NUMBER OF GRADIENT EVALUA-
  346. C             TIONS (CALLS ON CALCJ, EXCLUDING THOSE USED TO COMPUTE
  347. C             THE COVARIANCE MATRIX) TO IV(MXITER) + 1.  IF IV(MXITER)
  348. C             ITERATIONS DO NOT SUFFICE, THEN NL2SOL RETURNS WITH
  349. C             IV(1) = 10.  DEFAULT = 150.
  350. C IV(OUTLEV)... IV(19) CONTROLS THE NUMBER AND LENGTH OF ITERATION SUM-
  351. C             MARY LINES PRINTED (BY ITSMRY).  IV(OUTLEV) = 0 MEANS DO
  352. C             NOT PRINT ANY SUMMARY LINES.  OTHERWISE, PRINT A SUMMARY
  353. C             LINE AFTER EACH ABS(IV(OUTLEV)) ITERATIONS.  IF IV(OUTLEV)
  354. C             IS POSITIVE, THEN SUMMARY LINES OF LENGTH 117 (PLUS CARRI-
  355. C             AGE CONTROL) ARE PRINTED, INCLUDING THE FOLLOWING...  THE
  356. C             ITERATION AND FUNCTION EVALUATION COUNTS, CURRENT FUNC-
  357. C             TION VALUE (V(F) = HALF THE SUM OF SQUARES), RELATIVE
  358. C             DIFFERENCE IN FUNCTION VALUES ACHIEVED BY THE LATEST STEP
  359. C             (I.E., RELDF = (F0-V(F))/F0, WHERE F0 IS THE FUNCTION
  360. C             VALUE FROM THE PREVIOUS ITERATION), THE RELATIVE FUNCTION
  361. C             REDUCTION PREDICTED FOR THE STEP JUST TAKEN (I.E.,
  362. C             PRELDF = V(PREDUC) / F0, WHERE V(PREDUC) IS DESCRIBED
  363. C             BELOW), THE SCALED RELATIVE CHANGE IN X (SEE V(RELDX)
  364. C             BELOW), THE MODELS USED IN THE CURRENT ITERATION (G =
  365. C             GAUSS-NEWTON, S=AUGMENTED), THE MARQUARDT PARAMETER
  366. C             STPPAR USED IN COMPUTING THE LAST STEP, THE SIZING FACTOR
  367. C             USED IN UPDATING S, THE 2-NORM OF THE SCALE VECTOR D
  368. C             TIMES THE STEP JUST TAKEN (SEE REF. 1), AND NPRELDF, I.E.,
  369. C             V(NREDUC)/F0, WHERE V(NREDUC) IS DESCRIBED BELOW -- IF
  370. C             NPRELDF IS POSITIVE, THEN IT IS THE RELATIVE FUNCTION
  371. C             REDUCTION PREDICTED FOR A NEWTON STEP (ONE WITH
  372. C             STPPAR = 0).  IF NPRELDF IS ZERO, EITHER THE GRADIENT
  373. C             VANISHES (AS DOES PRELDF) OR ELSE THE AUGMENTED MODEL
  374. C             IS BEING USED AND ITS HESSIAN IS INDEFINITE (WITH PRELDF
  375. C             POSITIVE).  IF NPRELDF IS NEGATIVE, THEN IT IS THE NEGA-
  376. C             OF THE RELATIVE FUNCTION REDUCTION PREDICTED FOR A STEP
  377. C             COMPUTED WITH STEP BOUND V(LMAX0) FOR USE IN TESTING FOR
  378. C             SINGULAR CONVERGENCE.
  379. C                  IF IV(OUTLEV) IS NEGATIVE, THEN LINES OF MAXIMUM
  380. C             LENGTH 79 (OR 55 IS IV(COVPRT) = 0) ARE PRINTED, INCLUD-
  381. C             ING ONLY THE FIRST 6 ITEMS LISTED ABOVE (THROUGH RELDX).
  382. C             DEFAULT = 1.
  383. C IV(PARPRT)... IV(20) = 1 MEANS PRINT ANY NONDEFAULT V VALUES ON A
  384. C             FRESH START OR ANY CHANGED V VALUES ON A RESTART.
  385. C             IV(PARPRT) = 0 MEANS SKIP THIS PRINTING.  DEFAULT = 1.
  386. C IV(PRUNIT)... IV(21) IS THE OUTPUT UNIT NUMBER ON WHICH ALL PRINTING
  387. C             IS DONE.  IV(PRUNIT) = 0 MEANS SUPPRESS ALL PRINTING.
  388. C             (SETTING IV(PRUNIT) TO 0 IS THE ONLY WAY TO SUPPRESS THE
  389. C             ONE-LINE TERMINATION REASON MESSAGE PRINTED BY ITSMRY.)
  390. C             DEFAULT = STANDARD OUTPUT UNIT (UNIT 6 ON MOST SYSTEMS).
  391. C IV(SOLPRT)... IV(22) = 1 MEANS PRINT OUT THE VALUE OF X RETURNED (AS
  392. C             WELL AS THE CORRESPONDING GRADIENT AND SCALE VECTOR D).
  393. C             IV(SOLPRT) = 0 MEANS SKIP THIS PRINTING.  DEFAULT = 1.
  394. C IV(STATPR)... IV(23) = 1 MEANS PRINT SUMMARY STATISTICS UPON RETURN-
  395. C             ING.  THESE CONSIST OF THE FUNCTION VALUE (HALF THE SUM
  396. C             OF SQUARES) AT X, V(RELDX) (SEE BELOW), THE NUMBER OF
  397. C             FUNCTION AND GRADIENT EVALUATIONS (CALLS ON CALCR AND
  398. C             CALCJ RESPECTIVELY, EXCLUDING ANY CALLS USED TO COMPUTE
  399. C             THE COVARIANCE), THE RELATIVE FUNCTION REDUCTIONS PREDICT-
  400. C             ED FOR THE LAST STEP TAKEN AND FOR A NEWTON STEP (OR PER-
  401. C             HAPS A STEP BOUNDED BY V(LMAX0) -- SEE THE DESCRIPTIONS
  402. C             OF PRELDF AND NPRELDF UNDER IV(OUTLEV) ABOVE), AND (IF AN
  403. C             ATTEMPT WAS MADE TO COMPUTE THE COVARIANCE) THE NUMBER OF
  404. C             CALLS ON CALCR AND CALCJ USED IN TRYING TO COMPUTE THE
  405. C             COVARIANCE.  IV(STATPR) = 0 MEANS SKIP THIS PRINTING.
  406. C             DEFAULT = 1.
  407. C IV(X0PRT).... IV(24) = 1 MEANS PRINT THE INITIAL X AND SCALE VECTOR D
  408. C             (ON A FRESH START ONLY).  IV(X0PRT) = 0 MEANS SKIP THIS
  409. C             PRINTING.  DEFAULT = 1.
  410. C
  411. C  ***  (SELECTED) IV OUTPUT VALUES  ***
  412. C
  413. C IV(1)........ ON OUTPUT, IV(1) IS A RETURN CODE....
  414. C             3 = X-CONVERGENCE.  THE SCALED RELATIVE DIFFERENCE BE-
  415. C                  TWEEN THE CURRENT PARAMETER VECTOR X AND A LOCALLY
  416. C                  OPTIMAL PARAMETER VECTOR IS VERY LIKELY AT MOST
  417. C                  V(XCTOL).
  418. C             4 = RELATIVE FUNCTION CONVERGENCE.  THE RELATIVE DIFFER-
  419. C                  ENCE BETWEEN THE CURRENT FUNCTION VALUE AND ITS LO-
  420. C                  CALLY OPTIMAL VALUE IS VERY LIKELY AT MOST V(RFCTOL).
  421. C             5 = BOTH X- AND RELATIVE FUNCTION CONVERGENCE (I.E., THE
  422. C                  CONDITIONS FOR IV(1) = 3 AND IV(1) = 4 BOTH HOLD).
  423. C             6 = ABSOLUTE FUNCTION CONVERGENCE.  THE CURRENT FUNCTION
  424. C                  VALUE IS AT MOST V(AFCTOL) IN ABSOLUTE VALUE.
  425. C             7 = SINGULAR CONVERGENCE.  THE HESSIAN NEAR THE CURRENT
  426. C                  ITERATE APPEARS TO BE SINGULAR OR NEARLY SO, AND A
  427. C                  STEP OF LENGTH AT MOST V(LMAX0) IS UNLIKELY TO YIELD
  428. C                  A RELATIVE FUNCTION DECREASE OF MORE THAN V(RFCTOL).
  429. C             8 = FALSE CONVERGENCE.  THE ITERATES APPEAR TO BE CONVERG-
  430. C                  ING TO A NONCRITICAL POINT.  THIS MAY MEAN THAT THE
  431. C                  CONVERGENCE TOLERANCES (V(AFCTOL), V(RFCTOL),
  432. C                  V(XCTOL)) ARE TOO SMALL FOR THE ACCURACY TO WHICH
  433. C                  THE FUNCTION AND GRADIENT ARE BEING COMPUTED, THAT
  434. C                  THERE IS AN ERROR IN COMPUTING THE GRADIENT, OR THAT
  435. C                  THE FUNCTION OR GRADIENT IS DISCONTINUOUS NEAR X.
  436. C             9 = FUNCTION EVALUATION LIMIT REACHED WITHOUT OTHER CON-
  437. C                  VERGENCE (SEE IV(MXFCAL)).
  438. C            10 = ITERATION LIMIT REACHED WITHOUT OTHER CONVERGENCE
  439. C                  (SEE IV(MXITER)).
  440. C            11 = STOPX RETURNED .TRUE. (EXTERNAL INTERRUPT).  SEE THE
  441. C                  USAGE NOTES BELOW.
  442. C            13 = F(X) CANNOT BE COMPUTED AT THE INITIAL X.
  443. C            14 = BAD PARAMETERS PASSED TO ASSESS (WHICH SHOULD NOT
  444. C                  OCCUR).
  445. C            15 = THE JACOBIAN COULD NOT BE COMPUTED AT X (SEE CALCJ
  446. C                  ABOVE).
  447. C            16 = N OR P (OR PARAMETER NN TO NL2ITR) OUT OF RANGE --
  448. C                  P .LE. 0 OR N .LT. P OR NN .LT. N.
  449. C            17 = RESTART ATTEMPTED WITH N OR P (OR PAR. NN TO NL2ITR)
  450. C                  CHANGED.
  451. C            18 = IV(INITS) IS OUT OF RANGE.
  452. C            19...45 = V(IV(1)) IS OUT OF RANGE.
  453. C            50 = IV(1) WAS OUT OF RANGE.
  454. C            87...(86+P) = JTOL(IV(1)-86) (I.E., V(IV(1)) IS NOT
  455. C                  POSITIVE (SEE V(DFAC) BELOW).
  456. C IV(COVMAT)... IV(26) TELLS WHETHER A COVARIANCE MATRIX WAS COMPUTED.
  457. C             IF (IV(COVMAT) IS POSITIVE, THEN THE LOWER TRIANGLE OF
  458. C             THE COVARIANCE MATRIX IS STORED ROWWISE IN V STARTING AT
  459. C             V(IV(COVMAT)).  IF IV(COVMAT) = 0, THEN NO ATTEMPT WAS
  460. C             MADE TO COMPUTE THE COVARIANCE.  IF IV(COVMAT) = -1,
  461. C             THEN THE FINITE-DIFFERENCE HESSIAN WAS INDEFINITE.  AND
  462. C             AND IF IV(COVMAT) = -2, THEN A SUCCESSFUL FINITE-DIFFER-
  463. C             ENCING STEP COULD NOT BE FOUND FOR SOME COMPONENT OF X
  464. C             (I.E., CALCR SET NF TO 0 FOR EACH OF TWO TRIAL STEPS).
  465. C             NOTE THAT IV(COVMAT) IS RESET TO 0 AFTER EACH SUCCESSFUL
  466. C             STEP, SO IF SUCH A STEP IS TAKEN AFTER A RESTART, THEN
  467. C             THE COVARIANCE MATRIX WILL BE RECOMPUTED.
  468. C IV(D)........ IV(27) IS THE STARTING SUBSCRIPT IN V OF THE CURRENT
  469. C             SCALE VECTOR D.
  470. C IV(G)........ IV(28) IS THE STARTING SUBSCRIPT IN V OF THE CURRENT
  471. C             LEAST-SQUARES GRADIENT VECTOR (J**T)*R.
  472. C IV(NFCALL)... IV(6) IS THE NUMBER OF CALLS SO FAR MADE ON CALCR (I.E.,
  473. C             FUNCTION EVALUATIONS, INCLUDING THOSE USED IN COMPUTING
  474. C             THE COVARIANCE).
  475. C IV(NFCOV).... IV(40) IS THE NUMBER OF CALLS MADE ON CALCR WHEN
  476. C             TRYING TO COMPUTE COVARIANCE MATRICES.
  477. C IV(NGCALL)... IV(30) IS THE NUMBER OF GRADIENT EVALUATIONS (CALLS ON
  478. C             CALCJ) SO FAR DONE (INCLUDING THOSE USED FOR COMPUTING
  479. C             THE COVARIANCE).
  480. C IV(NGCOV).... IV(41) IS THE NUMBER OF CALLS MADE ON CALCJ WHEN
  481. C             TRYING TO COMPUTE COVARIANCE MATRICES.
  482. C IV(NITER).... IV(31) IS THE NUMBER OF ITERATIONS PERFORMED.
  483. C IV(R)........ IV(50) IS THE STARTING SUBSCRIPT IN V OF THE RESIDUAL
  484. C             VECTOR R CORRESPONDING TO X.
  485. C
  486. C  ***  (SELECTED) V INPUT VALUES (FROM SUBROUTINE DFAULT)  ***
  487. C
  488. C V(AFCTOL)... V(31) IS THE ABSOLUTE FUNCTION CONVERGENCE TOLERANCE.
  489. C             IF NL2SOL FINDS A POINT WHERE THE FUNCTION VALUE (HALF
  490. C             THE SUM OF SQUARES) IS LESS THAN V(AFCTOL), AND IF NL2SOL
  491. C             DOES NOT RETURN WITH IV(1) = 3, 4, OR 5, THEN IT RETURNS
  492. C             WITH IV(1) = 6.  DEFAULT = MAX(10**-20, MACHEP**2), WHERE
  493. C             MACHEP IS THE UNIT ROUNDOFF.
  494. C V(DELTA0)... V(44) IS A FACTOR USED IN CHOOSING THE FINITE-DIFFERENCE
  495. C             STEP SIZE USED IN COMPUTING THE COVARIANCE MATRIX WHEN
  496. C             IV(COVREQ) = 1 OR 2.  FOR COMPONENT I, STEP SIZE
  497. C                  V(DELTA0) * MAX(ABS(X(I)), 1/D(I)) * SIGN(X(I))
  498. C             IS USED, WHERE D IS THE CURRENT SCALE VECTOR (SEE REF. 1).
  499. C             (IF THIS STEP RESULTS IN CALCR SETTING NF TO 0, THEN -0.5
  500. C             TIMES THIS STEP IS ALSO TRIED.)  DEFAULT = MACHEP**0.5,
  501. C             WHERE MACHEP IS THE UNIT ROUNDOFF.
  502. C V(DFAC)..... V(41) AND THE D0 AND JTOL ARRAYS (SEE V(D0INIT) AND
  503. C             V(JTINIT)) ARE USED IN UPDATING THE SCALE VECTOR D WHEN
  504. C             IV(DTYPE) .GT. 0.  (D IS INITIALIZED ACCORDING TO
  505. C             V(DINIT).)  LET D1(I) =
  506. C               MAX(SQRT(JCNORM(I)**2 + MAX(S(I,I),0)), V(DFAC)*D(I)),
  507. C             WHERE JCNORM(I) IS THE 2-NORM OF THE I-TH COLUMN OF THE
  508. C             CURRENT JACOBIAN MATRIX AND S IS THE S MATRIX OF REF. 1.
  509. C             IF IV(DTYPE) = 1, THEN D(I) IS SET TO D1(I) UNLESS
  510. C             D1(I) .LT. JTOL(I), IN WHICH CASE D(I) IS SET TO
  511. C                                MAX(D0(I), JTOL(I)).
  512. C             IF IV(DTYPE) .GE. 2, THEN D IS UPDATED DURING THE FIRST
  513. C             ITERATION AS FOR IV(DTYPE) = 1 (AFTER ANY INITIALIZATION
  514. C             DUE TO V(DINIT)) AND IS LEFT UNCHANGED THEREAFTER.
  515. C             DEFAULT = 0.6.
  516. C V(DINIT).... V(38), IF NONNEGATIVE, IS THE VALUE TO WHICH THE SCALE
  517. C             VECTOR D IS INITIALIZED.  DEFAULT = 0.
  518. C V(DLTFDC)... V(40) HELPS CHOOSE THE STEP SIZE USED WHEN COMPUTING THE
  519. C             COVARIANCE MATRIX WHEN IV(COVREQ) = -1 OR -2.  FOR
  520. C             DIFFERENCES INVOLVING X(I), THE STEP SIZE FIRST TRIED IS
  521. C                       V(DLTFDC) * MAX(ABS(X(I)), 1/D(I)),
  522. C             WHERE D IS THE CURRENT SCALE VECTOR (SEE REF. 1).  (IF
  523. C             THIS STEP IS TOO BIG THE FIRST TIME IT IS TRIED, I.E., IF
  524. C             CALCR SETS NF TO 0, THEN -0.5 TIMES THIS STEP IS ALSO
  525. C             TRIED.)  DEFAULT = MACHEP**(1/3), WHERE MACHEP IS THE
  526. C             UNIT ROUNDOFF.
  527. C V(D0INIT)... V(37), IF POSITIVE, IS THE VALUE TO WHICH ALL COMPONENTS
  528. C             OF THE D0 VECTOR (SEE V(DFAC)) ARE INITIALIZED.  IF
  529. C             V(DFAC) = 0, THEN IT IS ASSUMED THAT THE CALLER HAS
  530. C             STORED D0 IN V STARTING AT V(P+87).  DEFAULT = 1.0.
  531. C V(JTINIT)... V(39), IF POSITIVE, IS THE VALUE TO WHICH ALL COMPONENTS
  532. C             OF THE JTOL ARRAY (SEE V(DFAC)) ARE INITIALIZED.  IF
  533. C             V(JTINIT) = 0, THEN IT IS ASSUMED THAT THE CALLER HAS
  534. C             STORED JTOL IN V STARTING AT V(87).  DEFAULT = 10**-6.
  535. C V(LMAX0).... V(35) GIVES THE MAXIMUM 2-NORM ALLOWED FOR D TIMES THE
  536. C             VERY FIRST STEP THAT NL2SOL ATTEMPTS.  IT IS ALSO USED
  537. C             IN TESTING FOR SINGULAR CONVERGENCE -- IF THE FUNCTION
  538. C             REDUCTION PREDICTED FOR A STEP OF LENGTH BOUNDED BY
  539. C             V(LMAX0) IS AT MOST V(RFCTOL) * ABS(F0), WHERE  F0  IS
  540. C             THE FUNCTION VALUE AT THE START OF THE CURRENT ITERATION,
  541. C             AND IF NL2SOL DOES NOT RETURN WITH IV(1) = 3, 4, 5, OR 6,
  542. C             THEN IT RETURNS WITH IV(1) = 7.    DEFAULT = 100.
  543. C V(RFCTOL)... V(32) IS THE RELATIVE FUNCTION CONVERGENCE TOLERANCE.
  544. C             IF THE CURRENT MODEL PREDICTS A MAXIMUM POSSIBLE FUNCTION
  545. C             REDUCTION (SEE V(NREDUC)) OF AT MOST V(RFCTOL)*ABS(F0) AT
  546. C             THE START OF THE CURRENT ITERATION, WHERE  F0  IS THE
  547. C             THEN CURRENT FUNCTION VALUE, AND IF THE LAST STEP ATTEMPT-
  548. C             ED ACHIEVED NO MORE THAN TWICE THE PREDICTED FUNCTION
  549. C             DECREASE, THEN NL2SOL RETURNS WITH IV(1) = 4 (OR 5).
  550. C             DEFAULT = MAX(10**-10, MACHEP**(2/3)), WHERE MACHEP IS
  551. C             THE UNIT ROUNDOFF.
  552. C V(TUNER1)... V(26) HELPS DECIDE WHEN TO CHECK FOR FALSE CONVERGENCE
  553. C             AND TO CONSIDER SWITCHING MODELS.  THIS IS DONE IF THE
  554. C             ACTUAL FUNCTION DECREASE FROM THE CURRENT STEP IS NO MORE
  555. C             THAN V(TUNER1) TIMES ITS PREDICTED VALUE.  DEFAULT = 0.1.
  556. C V(XCTOL).... V(33) IS THE X-CONVERGENCE TOLERANCE.  IF A NEWTON STEP
  557. C             (SEE V(NREDUC)) IS TRIED THAT HAS V(RELDX) .LE. V(XCTOL)
  558. C             AND IF THIS STEP YIELDS AT MOST TWICE THE PREDICTED FUNC-
  559. C             TION DECREASE, THEN NL2SOL RETURNS WITH IV(1) = 3 (OR 5).
  560. C             (SEE THE DESCRIPTION OF V(RELDX) BELOW.)
  561. C             DEFAULT = MACHEP**0.5, WHERE MACHEP IS THE UNIT ROUNDOFF.
  562. C V(XFTOL).... V(34) IS THE FALSE CONVERGENCE TOLERANCE.  IF A STEP IS
  563. C             TRIED THAT GIVES NO MORE THAN V(TUNER1) TIMES THE PREDICT-
  564. C             ED FUNCTION DECREASE AND THAT HAS V(RELDX) .LE. V(XFTOL),
  565. C             AND IF NL2SOL DOES NOT RETURN WITH IV(1) = 3, 4, 5, 6, OR
  566. C             7, THEN IT RETURNS WITH IV(1) = 8.  (SEE THE DESCRIPTION
  567. C             OF V(RELDX) BELOW.)  DEFAULT = 100*MACHEP, WHERE
  568. C             MACHEP IS THE UNIT ROUNDOFF.
  569. C V(*)........ DFAULT SUPPLIES TO V A NUMBER OF TUNING CONSTANTS, WITH
  570. C             WHICH IT SHOULD ORDINARILY BE UNNECESSARY TO TINKER.  SEE
  571. C             VERSION 2.2 OF THE NL2SOL USAGE SUMMARY (WHICH IS AN
  572. C             APPENDIX TO REF. 1).
  573. C
  574. C  ***  (SELECTED) V OUTPUT VALUES  ***
  575. C
  576. C V(DGNORM)... V(1) IS THE 2-NORM OF (D**-1)*G, WHERE G IS THE MOST RE-
  577. C             CENTLY COMPUTED GRADIENT AND D IS THE CORRESPONDING SCALE
  578. C             VECTOR.
  579. C V(DSTNRM)... V(2) IS THE 2-NORM OF D*STEP, WHERE STEP IS THE MOST RE-
  580. C             CENTLY COMPUTED STEP AND D IS THE CURRENT SCALE VECTOR.
  581. C V(F)........ V(10) IS THE CURRENT FUNCTION VALUE (HALF THE SUM OF
  582. C             SQUARES).
  583. C V(F0)....... V(13) IS THE FUNCTION VALUE AT THE START OF THE CURRENT
  584. C             ITERATION.
  585. C V(NREDUC)... V(6), IF POSITIVE, IS THE MAXIMUM FUNCTION REDUCTION
  586. C             POSSIBLE ACCORDING TO THE CURRENT MODEL, I.E., THE FUNC-
  587. C             TION REDUCTION PREDICTED FOR A NEWTON STEP (I.E.,
  588. C             STEP = -H**-1 * G,  WHERE  G = (J**T) * R  IS THE CURRENT
  589. C             GRADIENT AND H IS THE CURRENT HESSIAN APPROXIMATION --
  590. C             H = (J**T)*J  FOR THE GAUSS-NEWTON MODEL AND
  591. C             H = (J**T)*J + S  FOR THE AUGMENTED MODEL).
  592. C                  V(NREDUC) = ZERO MEANS H IS NOT POSITIVE DEFINITE.
  593. C                  IF V(NREDUC) IS NEGATIVE, THEN IT IS THE NEGATIVE OF
  594. C             THE FUNCTION REDUCTION PREDICTED FOR A STEP COMPUTED WITH
  595. C             A STEP BOUND OF V(LMAX0) FOR USE IN TESTING FOR SINGULAR
  596. C             CONVERGENCE.
  597. C V(PREDUC)... V(7) IS THE FUNCTION REDUCTION PREDICTED (BY THE CURRENT
  598. C             QUADRATIC MODEL) FOR THE CURRENT STEP.  THIS (DIVIDED BY
  599. C             V(F0)) IS USED IN TESTING FOR RELATIVE FUNCTION
  600. C             CONVERGENCE.
  601. C V(RELDX).... V(17) IS THE SCALED RELATIVE CHANGE IN X CAUSED BY THE
  602. C             CURRENT STEP, COMPUTED AS
  603. C                  MAX(ABS(D(I)*(X(I)-X0(I)), 1 .LE. I .LE. P) /
  604. C                     MAX(D(I)*(ABS(X(I))+ABS(X0(I))), 1 .LE. I .LE. P),
  605. C             WHERE X = X0 + STEP.
  606. C
  607. C-------------------------------  NOTES  -------------------------------
  608. C
  609. C  ***  ALGORITHM NOTES  ***
  610. C
  611. C        SEE REF. 1 FOR A DESCRIPTION OF THE ALGORITHM USED.
  612. C        ON PROBLEMS WHICH ARE NATURALLY WELL SCALED, BETTER PERFORM-
  613. C     ANCE MAY BE OBTAINED BY SETTING V(D0INIT) = 1.0 AND IV(DTYPE) = 0,
  614. C     WHICH WILL CAUSE THE SCALE VECTOR D TO BE SET TO ALL ONES.
  615. C
  616. C  ***  USAGE NOTES  ***
  617. C
  618. C        AFTER A RETURN WITH IV(1) .LE. 11, IT IS POSSIBLE TO RESTART,
  619. C     I.E., TO CHANGE SOME OF THE IV AND V INPUT VALUES DESCRIBED ABOVE
  620. C     AND CONTINUE THE ALGORITHM FROM THE POINT WHERE IT WAS INTERRUPT-
  621. C     ED.  IV(1) SHOULD NOT BE CHANGED, NOR SHOULD ANY ENTRIES OF IV
  622. C     AND V OTHER THAN THE INPUT VALUES (THOSE SUPPLIED BY DFAULT).
  623. C        THOSE WHO DO NOT WISH TO WRITE A CALCJ WHICH COMPUTES THE JA-
  624. C     COBIAN MATRIX ANALYTICALLY SHOULD CALL NL2SNO RATHER THAN NL2SOL.
  625. C     NL2SNO USES FINITE DIFFERENCES TO COMPUTE AN APPROXIMATE JACOBIAN.
  626. C        THOSE WHO WOULD PREFER TO PROVIDE R AND J (THE RESIDUAL AND
  627. C     JACOBIAN) BY REVERSE COMMUNICATION RATHER THAN BY WRITING SUBROU-
  628. C     TINES CALCR AND CALCJ MAY CALL ON NL2ITR DIRECTLY.  SEE THE COM-
  629. C     MENTS AT THE BEGINNING OF NL2ITR.
  630. C        THOSE WHO USE NL2SOL INTERACTIVELY MAY WISH TO SUPPLY THEIR
  631. C     OWN STOPX FUNCTION, WHICH SHOULD RETURN .TRUE. IF THE BREAK KEY
  632. C     HAS BEEN PRESSED SINCE STOPX WAS LAST INVOKED.  THIS MAKES IT POS-
  633. C     SIBLE TO EXTERNALLY INTERRUPT NL2SOL (WHICH WILL RETURN WITH
  634. C     IV(1) = 11 IF STOPX RETURNS .TRUE.).
  635. C        STORAGE FOR J IS ALLOCATED AT THE END OF V.  THUS THE CALLER
  636. C     MAY MAKE V LONGER THAN SPECIFIED ABOVE AND MAY ALLOW CALCJ TO USE
  637. C     ELEMENTS OF J BEYOND THE FIRST N*P AS SCRATCH STORAGE.
  638. C
  639. C  ***  PORTABILITY NOTES  ***
  640. C
  641. C        THE NL2SOL DISTRIBUTION TAPE CONTAINS BOTH SINGLE- AND DOUBLE-
  642. C     PRECISION VERSIONS OF THE NL2SOL SOURCE CODE, SO IT SHOULD BE UN-
  643. C     NECESSARY TO CHANGE PRECISIONS.
  644. C        ONLY THE FUNCTIONS IMDCON AND RMDCON CONTAIN MACHINE-DEPENDENT
  645. C     CONSTANTS.  TO CHANGE FROM ONE MACHINE TO ANOTHER, IT SHOULD
  646. C     SUFFICE TO CHANGE THE (FEW) RELEVANT LINES IN THESE FUNCTIONS.
  647. C        INTRINSIC FUNCTIONS ARE EXPLICITLY DECLARED.  ON CERTAIN COM-
  648. C     PUTERS (E.G. UNIVAC), IT MAY BE NECESSARY TO COMMENT OUT THESE
  649. C     DECLARATIONS.  SO THAT THIS MAY BE DONE AUTOMATICALLY BY A SIMPLE
  650. C     PROGRAM, SUCH DECLARATIONS ARE PRECEDED BY A COMMENT HAVING C/+
  651. C     IN COLUMNS 1-3 AND BLANKS IN COLUMNS 4-72 AND ARE FOLLOWED BY
  652. C     A COMMENT HAVING C/ IN COLUMNS 1 AND 2 AND BLANKS IN COLUMNS 3-72.
  653. C        THE NL2SOL SOURCE CODE IS EXPRESSED IN 1966 ANSI STANDARD
  654. C     FORTRAN.  IT MAY BE CONVERTED TO FORTRAN 77 BY
  655. C     COMMENTING OUT ALL LINES THAT FALL BETWEEN A LINE HAVING C/6 IN
  656. C     COLUMNS 1-3 AND A LINE HAVING C/7 IN COLUMNS 1-3 AND BY REMOVING
  657. C     (I.E., REPLACING BY A BLANK) THE C IN COLUMN 1 OF THE LINES THAT
  658. C     FOLLOW THE C/7 LINE AND PRECEED A LINE HAVING C/ IN COLUMNS 1-2
  659. C     AND BLANKS IN COLUMNS 3-72.  THESE CHANGES CONVERT SOME DATA
  660. C     STATEMENTS INTO PARAMETER STATEMENTS, CONVERT SOME VARIABLES FROM
  661. C     REAL TO CHARACTER*4, AND MAKE THE DATA STATEMENTS THAT INITIALIZE
  662. C     THESE VARIABLES USE CHARACTER STRINGS DELIMITED BY PRIMES INSTEAD
  663. C     OF HOLLERITH CONSTANTS.  (SUCH VARIABLES AND DATA STATEMENTS
  664. C     APPEAR ONLY IN MODULES ITSMRY AND PARCHK.  PARAMETER STATEMENTS
  665. C     APPEAR NEARLY EVERYWHERE.)
  666. C
  667. C  ***  REFERENCES  ***
  668. C
  669. C 1.  DENNIS, J.E., GAY, D.M., AND WELSCH, R.E. (1981), AN ADAPTIVE
  670. C             NONLINEAR LEAST-SQUARES ALGORITHM, ACM TRANS. MATH.
  671. C             SOFTWARE, VOL. 7, NO. 3.
  672. C
  673. C
  674. C  ***  GENERAL  ***
  675. C
  676. C     CODED BY DAVID M. GAY (WINTER 1979 - WINTER 1980).
  677. C     THIS SUBROUTINE WAS WRITTEN IN CONNECTION WITH RESEARCH
  678. C     SUPPORTED BY THE NATIONAL SCIENCE FOUNDATION UNDER GRANTS
  679. C     MCS-7600324, DCR75-10143, 76-14311DSS, MCS76-11989, AND
  680. C     MCS-7906671.
  681. C
  682. C----------------------------  DECLARATIONS  ---------------------------
  683. C
  684.       EXTERNAL ITSMRY, NL2ITR
  685. C ITSMRY... PRINTS ITERATION SUMMARY AND INFO ABOUT INITIAL AND FINAL X.
  686. C NL2ITR... REVERSE-COMMUNICATION ROUTINE THAT CARRIES OUT NL2SOL ALGO-
  687. C             RITHM.
  688. C
  689.       LOGICAL STRTED
  690.       INTEGER D1, J1, NF, R1
  691. C
  692. C  ***  SUBSCRIPTS FOR IV AND V  ***
  693. C
  694.       INTEGER D, J, NFCALL, NFGCAL, R, TOOBIG
  695. C
  696. C  ***  IV SUBSCRIPT VALUES  ***
  697. C
  698. C/6
  699.       DATA NFCALL/6/, NFGCAL/7/, TOOBIG/2/
  700. C/7
  701. C     PARAMETER (NFCALL=6, NFGCAL=7, TOOBIG=2)
  702. C/
  703. C
  704. C  ***  V SUBSCRIPT VALUES  ***
  705. C
  706. C/6
  707.       DATA D/27/, J/33/, R/50/
  708. C/7
  709. C     PARAMETER (D=27, J=33, R=50)
  710. C/
  711. C
  712. C+++++++++++++++++++++++++++++++  BODY  ++++++++++++++++++++++++++++++++
  713. C
  714.       D1 = 94 + 2*N + P*(3*P + 31)/2
  715.       IV(D) = D1
  716.       R1 = D1 + P
  717.       IV(R) = R1
  718.       J1 = R1 + N
  719.       IV(J) = J1
  720.       STRTED = .TRUE.
  721.       IF (IV(1) .NE. 0 .AND. IV(1) .NE. 12) GO TO 40
  722.          STRTED = .FALSE.
  723.          IV(NFCALL) = 1
  724.          IV(NFGCAL) = 1
  725. C
  726.  10   NF = IV(NFCALL)
  727.       CALL CALCR(N, P, X, NF, V(R1), UIPARM, URPARM, UFPARM)
  728.       IF (STRTED) GO TO 20
  729.          IF (NF .GT. 0) GO TO 30
  730.               IV(1) = 13
  731.               GO TO 60
  732. C
  733.  20   IF (NF .LE. 0) IV(TOOBIG) = 1
  734.       GO TO 40
  735. C
  736.  30   CALL CALCJ(N, P, X, IV(NFGCAL), V(J1), UIPARM, URPARM, UFPARM)
  737.       IF (IV(NFGCAL) .EQ. 0) GO TO 50
  738.       STRTED = .TRUE.
  739. C
  740.  40   CALL NL2ITR(V(D1), IV, V(J1), N, N, P, V(R1), V, X)
  741.       IF (IV(1) - 2) 10, 30, 999
  742. C
  743.  50   IV(1) = 15
  744.  60   CALL ITSMRY(V(D1), IV, P, V, X)
  745. C
  746.  999  RETURN
  747. C  ***  LAST CARD OF NL2SOL FOLLOWS  ***
  748.       END
  749.       SUBROUTINE NL2SNO(N, P, X, CALCR, IV, V, UIPARM, URPARM, UFPARM)  SNO00010
  750. C
  751. C  ***  LIKE NL2SOL, BUT WITHOUT CALCJ -- MINIMIZE NONLINEAR SUM OF  ***
  752. C  ***  SQUARES USING FINITE-DIFFERENCE JACOBIAN APPROXIMATIONS      ***
  753. C  ***  (NL2SOL VERSION 2.2)  ***
  754. C
  755.       INTEGER N, P, IV(1), UIPARM(1)
  756.       REAL X(P), V(1), URPARM(1)
  757. C     DIMENSION IV(60+P),  V(93 + N*P + 3*N + P*(3*P+33)/2)
  758.       EXTERNAL CALCR, UFPARM
  759. C
  760. C-----------------------------  DISCUSSION  ----------------------------
  761. C
  762. C        THE PARAMETERS FOR NL2SNO ARE THE SAME AS THOSE FOR NL2SOL
  763. C     (WHICH SEE), EXCEPT THAT CALCJ IS OMITTED.  INSTEAD OF CALLING
  764. C     CALCJ TO OBTAIN THE JACOBIAN MATRIX OF R AT X, NL2SNO COMPUTES
  765. C     AN APPROXIMATION TO IT BY FINITE (FORWARD) DIFFERENCES -- SEE
  766. C     V(DLTFDJ) BELOW.  NL2SNO USES FUNCTION VALUES ONLY WHEN COMPUT-
  767. C     THE COVARIANCE MATRIX (RATHER THAN THE FUNCTIONS AND GRADIENTS
  768. C     THAT NL2SOL MAY USE).  TO DO SO, NL2SNO SETS IV(COVREQ) TO -1 IF
  769. C     IV(COVPRT) = 1 WITH IV(COVREQ) = 0 AND TO MINUS ITS ABSOLUTE
  770. C     VALUE OTHERWISE.  THUS V(DELTA0) IS NEVER REFERENCED AND ONLY
  771. C     V(DLTFDC) MATTERS -- SEE NL2SOL FOR A DESCRIPTION OF V(DLTFDC).
  772. C        THE NUMBER OF EXTRA CALLS ON CALCR USED IN COMPUTING THE JACO-
  773. C     BIAN APPROXIMATION ARE NOT INCLUDED IN THE FUNCTION EVALUATION
  774. C     COUNT IV(NFCALL) AND ARE NOT OTHERWISE REPORTED.
  775. C
  776. C V(DLTFDJ)... V(36) HELPS CHOOSE THE STEP SIZE USED WHEN COMPUTING THE
  777. C             FINITE-DIFFERENCE JACOBIAN MATRIX.  FOR DIFFERENCES IN-
  778. C             VOLVING X(I), THE STEP SIZE FIRST TRIED IS
  779. C                       V(DLTFDJ) * MAX(ABS(X(I)), 1/D(I)),
  780. C             WHERE D IS THE CURRENT SCALE VECTOR (SEE REF. 1).  (IF
  781. C             THIS STEP IS TOO BIG, I.E., IF CALCR SETS NF TO 0, THEN
  782. C             SMALLER STEPS ARE TRIED UNTIL THE STEP SIZE IS SHRUNK BE-
  783. C             LOW 1000 * MACHEP, WHERE MACHEP IS THE UNIT ROUNDOFF.
  784. C             DEFAULT = MACHEP**0.5.
  785. C
  786. C  ***  REFERENCES  ***
  787. C
  788. C 1.  DENNIS, J.E., GAY, D.M., AND WELSCH, R.E. (1981), AN ADAPTIVE
  789. C             NONLINEAR LEAST-SQUARES ALGORITHM, ACM TRANS. MATH.
  790. C             SOFTWARE, VOL. 7, NO. 3.
  791. C
  792. C  ***  GENERAL  ***
  793. C
  794. C     CODED BY DAVID M. GAY.
  795. C     THIS SUBROUTINE WAS WRITTEN IN CONNECTION WITH RESEARCH
  796. C     SUPPORTED BY THE NATIONAL SCIENCE FOUNDATION UNDER GRANTS
  797. C     MCS-7600324, DCR75-10143, 76-14311DSS, MCS76-11989, AND
  798. C     MCS-7906671.
  799. C
  800. C+++++++++++++++++++++++++++  DECLARATIONS  ++++++++++++++++++++++++++++
  801. C
  802. C  ***  INTRINSIC FUNCTIONS  ***
  803. C/+
  804.       INTEGER IABS
  805.       REAL ABS, AMAX1
  806. C/
  807. C  ***  EXTERNAL FUNCTIONS AND SUBROUTINES  ***
  808. C
  809.       EXTERNAL DFAULT, ITSMRY, NL2ITR, RMDCON, VSCOPY
  810.       REAL RMDCON
  811. C
  812. C DFAULT... SUPPLIES DEFAULT PARAMETER VALUES.
  813. C ITSMRY... PRINTS ITERATION SUMMARY AND INFO ABOUT INITIAL AND FINAL X.
  814. C NL2ITR... REVERSE-COMMUNICATION ROUTINE THAT CARRIES OUT NL2SOL ALGO-
  815. C             RITHM.
  816. C RMDCON... RETURNS MACHINE-DEPENDENT CONSTANTS.
  817. C VSCOPY... SETS ALL ELEMENTS OF A VECTOR TO A SCALAR.
  818. C
  819.       LOGICAL STRTED
  820.       INTEGER DK, D1, I, J1, J1K, K, NF, RN, R1, DINIT
  821.       REAL H, HFAC, HLIM, NEGPT5, ONE, XK, ZERO
  822. C
  823. C  ***  SUBSCRIPTS FOR IV AND V  ***
  824. C
  825.       INTEGER COVPRT, COVREQ, D, DLTFDJ, DTYPE, J, NFCALL, NFGCAL, R,
  826.      1        TOOBIG
  827. C
  828. C/6
  829.       DATA HFAC/1.E+3/, NEGPT5/-0.5E+0/, ONE/1.E+0/, ZERO/0.E+0/
  830. C/7
  831. C     PARAMETER (HFAC=1.D+3, NEGPT5=-0.5D+0, ONE=1.D+0, ZERO=0.D+0)
  832. C/
  833. C
  834. C  ***  IV SUBSCRIPT VALUES  ***
  835. C
  836. C/6
  837.       DATA COVPRT/14/, COVREQ/15/, D/27/, DTYPE/16/, J/33/,
  838.      1     NFCALL/6/, NFGCAL/7/, R/50/, TOOBIG/2/
  839. C/7
  840. C     PARAMETER (COVPRT=14, COVREQ=15, D=27, DTYPE=16, J=33,
  841. C    1     NFCALL=6, NFGCAL=7, R=50, TOOBIG=2)
  842. C/
  843. C
  844. C  ***  V SUBSCRIPT VALUES  ***
  845. C
  846. C/6
  847.       DATA DLTFDJ/36/, DINIT/38/
  848. C/7
  849. C     PARAMETER (DLTFDJ=36)
  850. C     SAVE HLIM
  851. C/
  852.       DATA HLIM/0.E+0/
  853. C
  854. C+++++++++++++++++++++++++++++++  BODY  ++++++++++++++++++++++++++++++++
  855. C
  856.       D1 = 94 + 2*N + P*(3*P + 31)/2
  857.       IV(D) = D1
  858.       R1 = D1 + P
  859.       IV(R) = R1
  860.       J1 = R1 + N
  861.       IV(J) = J1
  862.       RN = J1 - 1
  863.       IF (IV(1) .EQ. 0) CALL DFAULT(IV, V)
  864.       IV(COVREQ) = -IABS(IV(COVREQ))
  865.       IF (IV(COVPRT) .NE. 0 .AND. IV(COVREQ) .EQ. 0) IV(COVREQ) = -1
  866.       STRTED = .TRUE.
  867.       IF (IV(1) .NE. 12) GO TO 80
  868.          STRTED = .FALSE.
  869.          IV(NFCALL) = 1
  870.          IV(NFGCAL) = 1
  871. C        ***  INITIALIZE SCALE VECTOR D TO ONES FOR COMPUTING
  872. C        ***  INITIAL JACOBIAN.
  873.          IF (IV(DTYPE) .GT. 0) CALL VSCOPY(P, V(D1), ONE)
  874.        IF (V(DINIT).GT.ZERO) CALL VSCOPY(P, V(D1), V(DINIT))
  875. C
  876.  10   NF = IV(NFCALL)
  877.       CALL CALCR(N, P, X, NF, V(R1), UIPARM, URPARM, UFPARM)
  878.       IF (STRTED) GO TO 20
  879.          IF (NF .GT. 0) GO TO 30
  880.               IV(1) = 13
  881.               GO TO 90
  882. C
  883.  20   IF (NF .LE. 0) IV(TOOBIG) = 1
  884.       GO TO 80
  885. C
  886. C  ***  COMPUTE FINITE-DIFFERENCE JACOBIAN  ***
  887. C
  888.  30   J1K = J1
  889.       DK = D1
  890.       DO 70 K = 1, P
  891.          XK = X(K)
  892.          H = V(DLTFDJ) * AMAX1(ABS(XK), ONE/V(DK))
  893.          DK = DK + 1
  894.  40      X(K) = XK + H
  895.          NF = IV(NFGCAL)
  896.          CALL CALCR (N, P, X, NF, V(J1K), UIPARM, URPARM, UFPARM)
  897.          IF (NF .GT. 0) GO TO 50
  898.               IF (HLIM .EQ. ZERO) HLIM = HFAC * RMDCON(3)
  899. C             ***  HLIM = HFAC TIMES THE UNIT ROUNDOFF  ***
  900.               H = NEGPT5 * H
  901.               IF (ABS(H) .GE. HLIM) GO TO 40
  902.                    IV(1) = 15
  903.                    GO TO 90
  904.  50      X(K) = XK
  905.          DO 60 I = R1, RN
  906.               V(J1K) = (V(J1K) - V(I)) / H
  907.               J1K = J1K + 1
  908.  60           CONTINUE
  909.  70      CONTINUE
  910. C
  911.       STRTED = .TRUE.
  912. C
  913.  80   CALL NL2ITR(V(D1), IV, V(J1), N, N, P, V(R1), V, X)
  914.       IF (IV(1) - 2) 10, 30, 999
  915. C
  916.  90   CALL ITSMRY(V(D1), IV, P, V, X)
  917. C
  918.  999  RETURN
  919. C  ***  LAST CARD OF NL2SNO FOLLOWS  ***
  920.       END
  921.       SUBROUTINE NL2ITR (D, IV, J, N, NN, P, R, V, X)                   ITR00010
  922. C
  923. C  ***  CARRY OUT NL2SOL (NONLINEAR LEAST-SQUARES) ITERATIONS  ***
  924. C  ***  (NL2SOL VERSION 2.2)  ***
  925. C
  926. C  ***  PARAMETER DECLARATIONS  ***
  927. C
  928.       INTEGER IV(1), N, NN, P
  929.       REAL D(P), J(NN,P), R(N), V(1), X(P)
  930. C     DIMENSION IV(60+P), V(93 + 2*N + P*(3*P+31)/2)
  931. C
  932. C
  933. C--------------------------  PARAMETER USAGE  --------------------------
  934. C
  935. C D.... SCALE VECTOR.
  936. C IV... INTEGER VALUE ARRAY.
  937. C J.... N BY P JACOBIAN MATRIX (LEAD DIMENSION NN).
  938. C N.... NUMBER OF OBSERVATIONS (COMPONENTS IN R).
  939. C NN... LEAD DIMENSION OF J.
  940. C P.... NUMBER OF PARAMETERS (COMPONENTS IN X).
  941. C R.... RESIDUAL VECTOR.
  942. C V.... FLOATING-POINT VALUE ARRAY.
  943. C X.... PARAMETER VECTOR.
  944. C
  945. C  ***  DISCUSSION  ***
  946. C
  947. C        PARAMETERS IV, N, P, V, AND X ARE THE SAME AS THE CORRESPOND-
  948. C     ING ONES TO NL2SOL (WHICH SEE), EXCEPT THAT V CAN BE SHORTER
  949. C     (SINCE THE PART OF V THAT NL2SOL USES FOR STORING D, J, AND R IS
  950. C     NOT NEEDED).  MOREOVER, COMPARED WITH NL2SOL, IV(1) MAY HAVE THE
  951. C     TWO ADDITIONAL OUTPUT VALUES 1 AND 2, WHICH ARE EXPLAINED BELOW,
  952. C     AS IS THE USE OF IV(TOOBIG) AND IV(NFGCAL).  THE VALUES IV(D),
  953. C     IV(J), AND IV(R), WHICH ARE OUTPUT VALUES FROM NL2SOL (AND
  954. C     NL2SNO), ARE NOT REFERENCED BY NL2ITR OR THE SUBROUTINES IT CALLS.
  955. C        ON A FRESH START, I.E., A CALL ON NL2ITR WITH IV(1) = 0 OR 12,
  956. C     NL2ITR ASSUMES THAT R = R(X), THE RESIDUAL AT X, AND J = J(X),
  957. C     THE CORRESPONDING JACOBIAN MATRIX OF R AT X.
  958. C
  959. C IV(1) = 1 MEANS THE CALLER SHOULD SET R TO R(X), THE RESIDUAL AT X,
  960. C             AND CALL NL2ITR AGAIN, HAVING CHANGED NONE OF THE OTHER
  961. C             PARAMETERS.  AN EXCEPTION OCCURS IF R CANNOT BE EVALUATED
  962. C             AT X (E.G. IF R WOULD OVERFLOW), WHICH MAY HAPPEN BECAUSE
  963. C             OF AN OVERSIZED STEP.  IN THIS CASE THE CALLER SHOULD SET
  964. C             IV(TOOBIG) = IV(2) TO 1, WHICH WILL CAUSE NL2ITR TO IG-
  965. C             NORE R AND TRY A SMALLER STEP.  THE PARAMETER NF THAT
  966. C             NL2SOL PASSES TO CALCR (FOR POSSIBLE USE BY CALCJ) IS A
  967. C             COPY OF IV(NFCALL) = IV(6).
  968. C IV(1) = 2 MEANS THE CALLER SHOULD SET J TO J(X), THE JACOBIAN MATRIX
  969. C             OF R AT X, AND CALL NL2ITR AGAIN.  THE CALLER MAY CHANGE
  970. C             D AT THIS TIME, BUT SHOULD NOT CHANGE ANY OF THE OTHER
  971. C             PARAMETERS.  THE PARAMETER NF THAT NL2SOL PASSES TO
  972. C             CALCJ IS IV(NFGCAL) = IV(7).  IF J CANNOT BE EVALUATED
  973. C             AT X, THEN THE CALLER MAY SET IV(NFGCAL) TO 0, IN WHICH
  974. C             CASE NL2ITR WILL RETURN WITH IV(1) = 15.
  975. C
  976. C  ***  GENERAL  ***
  977. C
  978. C     CODED BY DAVID M. GAY.
  979. C     THIS SUBROUTINE WAS WRITTEN IN CONNECTION WITH RESEARCH
  980. C     SUPPORTED BY THE NATIONAL SCIENCE FOUNDATION UNDER GRANTS
  981. C
  982. C     MCS-7600324, DCR75-10143, 76-14311DSS, MCS76-11989, AND
  983. C     MCS-7906671.
  984. C        (SEE NL2SOL FOR REFERENCES.)
  985. C
  986. C+++++++++++++++++++++++++++  DECLARATIONS  ++++++++++++++++++++++++++++
  987. C
  988. C  ***  LOCAL VARIABLES  ***
  989. C
  990.       INTEGER DUMMY, DIG1, G1, G01, H0, H1, I, IM1, IPIVI, IPIVK, IPIV1,
  991.      1        IPK, K, KM1, L, LKY1, LMAT1, LSTGST, M, PP1O2, QTR1,
  992.      2        RDK, RD0, RD1, RSAVE1, SMH, SSTEP, STEP1, STPMOD, S1,
  993.      3        TEMP1, TEMP2, W1, X01
  994.       REAL E, RDOF1, STTSST, T, T1
  995. C
  996. C     ***  CONSTANTS  ***
  997. C
  998.       REAL HALF, NEGONE, ONE, ZERO
  999. C
  1000. C  ***  INTRINSIC FUNCTIONS  ***
  1001. C/+
  1002.       INTEGER IABS
  1003.       REAL ABS
  1004. C/
  1005. C  ***  EXTERNAL FUNCTIONS AND SUBROUTINES  ***
  1006. C
  1007.       EXTERNAL ASSESS, COVCLC, DOTPRD, DUPDAT, GQTSTP, ITSMRY, LMSTEP,
  1008.      1         PARCHK, QAPPLY, QRFACT, RPTMUL, SLUPDT, SLVMUL, STOPX,
  1009.      2         VAXPY, VCOPY, VSCOPY, V2NORM
  1010.       LOGICAL STOPX
  1011.       REAL DOTPRD, V2NORM
  1012. C
  1013. C ASSESS... ASSESSES CANDIDATE STEP.
  1014. C COVCLC... COMPUTES COVARIANCE MATRIX.
  1015. C DOTPRD... RETURNS INNER PRODUCT OF TWO VECTORS.
  1016. C DUPDAT... UPDATES SCALE VECTOR D.
  1017. C GQTSTP... COMPUTES GOLDFELD-QUANDT-TROTTER STEP (AUGMENTED MODEL).
  1018. C ITSMRY... PRINTS ITERATION SUMMARY AND INFO ABOUT INITIAL AND FINAL X.
  1019. C LMSTEP... COMPUTES LEVENBERG-MARQUARDT STEP (GAUSS-NEWTON MODEL).
  1020. C PARCHK... CHECKS VALIDITY OF INPUT IV AND V VALUES.
  1021. C QAPPLY... APPLIES ORTHOGONAL MATRIX Q FROM QRFACT TO A VECTOR.
  1022. C QRFACT... COMPUTES QR DECOMPOSITION OF A MATRIX VIA HOUSEHOLDER TRANS.
  1023. C RPTMUL... MULTIPLIES VECTOR BY THE R MATRIX (AND/OR ITS TRANSPOSE)
  1024. C             STORED BY QRFACT.
  1025. C SLUPDT... PERFORMS QUASI-NEWTON UPDATE ON COMPACTLY STORED LOWER TRI-
  1026. C             ANGLE OF A SYMMETRIC MATRIX.
  1027. C STOPX.... RETURNS .TRUE. IF THE BREAK KEY HAS BEEN PRESSED.
  1028. C VAXPY.... COMPUTES SCALAR TIMES ONE VECTOR PLUS ANOTHER.
  1029. C VCOPY.... COPIES ONE VECTOR TO ANOTHER.
  1030. C VSCOPY... SETS ALL ELEMENTS OF A VECTOR TO A SCALAR.
  1031. C V2NORM... RETURNS THE 2-NORM OF A VECTOR.
  1032. C
  1033. C  ***  SUBSCRIPTS FOR IV AND V  ***
  1034. C
  1035.       INTEGER CNVCOD, COSMIN, COVMAT, COVPRT, COVREQ, DGNORM, DIG,
  1036.      1        DINIT, DSTNRM, DTYPE, D0INIT, F, FDIF, FUZZ,
  1037.      2        F0, G, GTSTEP, H, IERR, INCFAC, INITS, IPIVOT, IPIV0, IRC,
  1038.      3        JTINIT, JTOL1, KAGQT, KALM, LKY, LMAT, LMAX0, MODE, MODEL,
  1039.      4        MXFCAL, MXITER, NFCALL, NFGCAL, NFCOV, NGCOV, NGCALL,
  1040.      5        NITER, NVSAVE, PHMXFC, PREDUC, QTR, RADFAC, RADINC,
  1041.      6        RADIUS, RAD0, RD, RESTOR, RLIMIT, RSAVE, S, SIZE, STEP,
  1042.      7        STGLIM, STLSTG, STPPAR, SUSED, SWITCH, TOOBIG, TUNER4,
  1043.      8        TUNER5, VSAVE1, W, WSCALE, XIRC, X0
  1044. C
  1045. C  ***  IV SUBSCRIPT VALUES  ***
  1046. C
  1047. C/6
  1048.       DATA CNVCOD/34/, COVMAT/26/, COVPRT/14/,
  1049.      1     COVREQ/15/, DIG/43/, DTYPE/16/, G/28/, H/44/,
  1050.      2     IERR/32/, INITS/25/, IPIVOT/61/, IPIV0/60/,
  1051.      3     IRC/3/, KAGQT/35/, KALM/36/, LKY/37/, LMAT/58/,
  1052.      4     MODE/38/, MODEL/5/, MXFCAL/17/, MXITER/18/,
  1053.      5     NFCALL/6/, NFGCAL/7/, NFCOV/40/, NGCOV/41/,
  1054.      6     NGCALL/30/, NITER/31/, QTR/49/,
  1055.      7     RADINC/8/, RD/51/, RESTOR/9/, RSAVE/52/, S/53/,
  1056.      8     STEP/55/, STGLIM/11/, STLSTG/56/, SUSED/57/,
  1057.      9     SWITCH/12/, TOOBIG/2/, W/59/, XIRC/13/, X0/60/
  1058. C/7
  1059. C     PARAMETER (CNVCOD=34, COVMAT=26, COVPRT=14,
  1060. C    1     COVREQ=15, DIG=43, DTYPE=16, G=28, H=44,
  1061. C    2     IERR=32, INITS=25, IPIVOT=61, IPIV0=60,
  1062. C    3     IRC=3, KAGQT=35, KALM=36, LKY=37, LMAT=58,
  1063. C    4     MODE=38, MODEL=5, MXFCAL=17, MXITER=18,
  1064. C    5     NFCALL=6, NFGCAL=7, NFCOV=40, NGCOV=41,
  1065. C    6     NGCALL=30, NITER=31, QTR=49,
  1066. C    7     RADINC=8, RD=51, RESTOR=9, RSAVE=52, S=53,
  1067. C    8     STEP=55, STGLIM=11, STLSTG=56, SUSED=57,
  1068. C    9     SWITCH=12, TOOBIG=2, W=59, XIRC=13, X0=60)
  1069. C/
  1070. C
  1071. C  ***  V SUBSCRIPT VALUES  ***
  1072. C
  1073. C/6
  1074.       DATA COSMIN/43/, DGNORM/1/, DINIT/38/, DSTNRM/2/,
  1075.      1     D0INIT/37/, F/10/, FDIF/11/, FUZZ/45/,
  1076.      2     F0/13/, GTSTEP/4/, INCFAC/23/,
  1077.      3     JTINIT/39/, JTOL1/87/, LMAX0/35/,
  1078.      4     NVSAVE/9/, PHMXFC/21/, PREDUC/7/,
  1079.      5     RADFAC/16/, RADIUS/8/, RAD0/9/, RLIMIT/42/,
  1080.      6     SIZE/47/, STPPAR/5/, TUNER4/29/, TUNER5/30/,
  1081.      7     VSAVE1/78/, WSCALE/48/
  1082. C/7
  1083. C     PARAMETER (COSMIN=43, DGNORM=1, DINIT=38, DSTNRM=2,
  1084. C    1     D0INIT=37, F=10, FDIF=11, FUZZ=45,
  1085. C    2     F0=13, GTSTEP=4, INCFAC=23,
  1086. C    3     JTINIT=39, JTOL1=87, LMAX0=35,
  1087. C    4     NVSAVE=9, PHMXFC=21, PREDUC=7,
  1088. C    5     RADFAC=16, RADIUS=8, RAD0=9, RLIMIT=42,
  1089. C    6     SIZE=47, STPPAR=5, TUNER4=29, TUNER5=30,
  1090. C    7     VSAVE1=78, WSCALE=48)
  1091. C/
  1092. C
  1093. C
  1094. C/6
  1095.       DATA HALF/0.5E+0/, NEGONE/-1.E+0/, ONE/1.E+0/, ZERO/0.E+0/
  1096. C/7
  1097. C     PARAMETER (HALF=0.5D+0, NEGONE=-1.D+0, ONE=1.D+0, ZERO=0.D+0)
  1098. C/
  1099. C
  1100. C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1101. C
  1102.       I = IV(1)
  1103.       IF (I .EQ. 1) GO TO 20
  1104.       IF (I .EQ. 2) GO TO 50
  1105. C
  1106. C  ***  CHECK VALIDITY OF IV AND V INPUT VALUES  ***
  1107. C
  1108. C     ***  NOTE -- IF IV(1) = 0, THEN PARCHK CALLS DFAULT(IV, V)  ***
  1109.       CALL PARCHK(IV, N, NN, P, V)
  1110.       I = IV(1) - 2
  1111.       IF (I .GT. 10) GO TO 999
  1112.       GO TO (350, 350, 350, 350, 350, 350, 195, 160, 195, 10), I
  1113. C
  1114. C  ***  INITIALIZATION AND STORAGE ALLOCATION  ***
  1115. C
  1116.  10   IV(NITER) = 0
  1117.       IV(NFCALL) = 1
  1118.       IV(NGCALL) = 1
  1119.       IV(NFGCAL) = 1
  1120.       IV(MODE) = -1
  1121.       IV(STGLIM) = 2
  1122.       IV(TOOBIG) = 0
  1123.       IV(CNVCOD) = 0
  1124.       IV(COVMAT) = 0
  1125.       IV(NFCOV) = 0
  1126.       IV(NGCOV) = 0
  1127.       IV(KALM) = -1
  1128.       IV(RADINC) = 0
  1129.       IV(S) = JTOL1 + 2*P
  1130.       PP1O2 = P * (P + 1) / 2
  1131.       IV(X0) = IV(S) + PP1O2
  1132.       IV(STEP) = IV(X0) + P
  1133.       IV(STLSTG) = IV(STEP) + P
  1134.       IV(DIG) = IV(STLSTG) + P
  1135.       IV(G) = IV(DIG) + P
  1136.       IV(LKY) = IV(G) + P
  1137.       IV(RD) = IV(LKY) + P
  1138.       IV(RSAVE) = IV(RD) + P
  1139.       IV(QTR) = IV(RSAVE) + N
  1140.       IV(H) = IV(QTR) + N
  1141.       IV(W) = IV(H) + PP1O2
  1142.       IV(LMAT) = IV(W) + 4*P + 7
  1143. C     +++ LENGTH OF W = P*(P+9)/2 + 7.  LMAT IS CONTAINED IN W.
  1144.       IF (V(DINIT) .GE. ZERO) CALL VSCOPY(P, D, V(DINIT))
  1145.       IF (V(JTINIT) .GT. ZERO) CALL VSCOPY(P, V(JTOL1), V(JTINIT))
  1146.       I = JTOL1 + P
  1147.       IF (V(D0INIT) .GT. ZERO) CALL VSCOPY(P, V(I), V(D0INIT))
  1148.       V(RAD0) = ZERO
  1149.       V(STPPAR) = ZERO
  1150.       V(RADIUS) = V(LMAX0) / (ONE + V(PHMXFC))
  1151. C
  1152. C  ***  SET INITIAL MODEL AND S MATRIX  ***
  1153. C
  1154.       IV(MODEL) = 1
  1155.       IF (IV(INITS) .EQ. 2) IV(MODEL) = 2
  1156.       S1 = IV(S)
  1157.       IF (IV(INITS) .EQ. 0) CALL VSCOPY(PP1O2, V(S1), ZERO)
  1158. C
  1159. C  ***  COMPUTE FUNCTION VALUE (HALF THE SUM OF SQUARES)  ***
  1160. C
  1161.  20   T = V2NORM(N, R)
  1162.       IF (T .GT. V(RLIMIT)) IV(TOOBIG) = 1
  1163.       IF (IV(TOOBIG) .NE. 0) GO TO 30
  1164.       V(F) = HALF * T**2
  1165.  30   IF (IV(MODE)) 40, 350, 730
  1166. C
  1167.  40   IF (IV(TOOBIG) .EQ. 0) GO TO 60
  1168.          IV(1) = 13
  1169.          GO TO 900
  1170. C
  1171. C  ***  MAKE SURE JACOBIAN COULD BE COMPUTED  ***
  1172. C
  1173.  50   IF (IV(NFGCAL) .NE. 0) GO TO 60
  1174.          IV(1) = 15
  1175.          GO TO 900
  1176. C
  1177. C  ***  COMPUTE GRADIENT  ***
  1178. C
  1179.  60   IV(KALM) = -1
  1180.       G1 = IV(G)
  1181.       DO 70 I = 1, P
  1182.          V(G1) = DOTPRD(N, R, J(1,I))
  1183.          G1 = G1 + 1
  1184.  70      CONTINUE
  1185.       IF (IV(MODE) .GT. 0) GO TO 710
  1186. C
  1187. C  ***  UPDATE D AND MAKE COPIES OF R FOR POSSIBLE USE LATER  ***
  1188. C
  1189.       IF (IV(DTYPE) .GT. 0) CALL DUPDAT(D, IV, J, N, NN, P, V)
  1190.       RSAVE1 = IV(RSAVE)
  1191.       CALL VCOPY(N, V(RSAVE1), R)
  1192.       QTR1 = IV(QTR)
  1193.       CALL VCOPY(N, V(QTR1), R)
  1194. C
  1195. C  ***  COMPUTE  D**-1 * GRADIENT  ***
  1196. C
  1197.       G1 = IV(G)
  1198.       DIG1 = IV(DIG)
  1199.       K = DIG1
  1200.       DO 80 I = 1, P
  1201.          V(K) = V(G1) / D(I)
  1202.          K = K + 1
  1203.          G1 = G1 + 1
  1204.  80      CONTINUE
  1205.       V(DGNORM) = V2NORM(P, V(DIG1))
  1206. C
  1207.       IF (IV(CNVCOD) .NE. 0) GO TO 700
  1208.       IF (IV(MODE) .EQ. 0) GO TO 570
  1209.       IV(MODE) = 0
  1210. C
  1211. C
  1212. C-----------------------------  MAIN LOOP  -----------------------------
  1213. C
  1214. C
  1215. C  ***  PRINT ITERATION SUMMARY, CHECK ITERATION LIMIT  ***
  1216. C
  1217.  150  CALL ITSMRY(D, IV, P, V, X)
  1218.  160  K = IV(NITER)
  1219.       IF (K .LT. IV(MXITER)) GO TO 170
  1220.          IV(1) = 10
  1221.          GO TO 900
  1222.  170  IV(NITER) = K + 1
  1223. C
  1224. C  ***  UPDATE RADIUS  ***
  1225. C
  1226.       IF (K .EQ. 0) GO TO 185
  1227.       STEP1 = IV(STEP)
  1228.       DO 180 I = 1, P
  1229.          V(STEP1) = D(I) * V(STEP1)
  1230.          STEP1 = STEP1 + 1
  1231.  180     CONTINUE
  1232.       STEP1 = IV(STEP)
  1233.       V(RADIUS) = V(RADFAC) * V2NORM(P, V(STEP1))
  1234. C
  1235. C  ***  INITIALIZE FOR START OF NEXT ITERATION  ***
  1236. C
  1237.  185  X01 = IV(X0)
  1238.       V(F0) = V(F)
  1239.       IV(KAGQT) = -1
  1240.       IV(IRC) = 4
  1241.       IV(H) = -IABS(IV(H))
  1242.       IV(SUSED) = IV(MODEL)
  1243. C
  1244. C     ***  COPY X TO X0  ***
  1245. C
  1246.       CALL VCOPY(P, V(X01), X)
  1247. C
  1248. C  ***  CHECK STOPX AND FUNCTION EVALUATION LIMIT  ***
  1249. C
  1250.  190  IF (.NOT. STOPX(DUMMY)) GO TO 200
  1251.          IV(1) = 11
  1252.          GO TO 205
  1253. C
  1254. C     ***  COME HERE WHEN RESTARTING AFTER FUNC. EVAL. LIMIT OR STOPX.
  1255. C
  1256.  195  IF (V(F) .GE. V(F0)) GO TO 200
  1257.          V(RADFAC) = ONE
  1258.          K = IV(NITER)
  1259.          GO TO 170
  1260. C
  1261.  200  IF (IV(NFCALL) .LT. IV(MXFCAL) + IV(NFCOV)) GO TO 210
  1262.          IV(1) = 9
  1263.  205     IF (V(F) .GE. V(F0)) GO TO 900
  1264. C
  1265. C        ***  IN CASE OF STOPX OR FUNCTION EVALUATION LIMIT WITH
  1266. C        ***  IMPROVED V(F), EVALUATE THE GRADIENT AT X.
  1267. C
  1268.               IV(CNVCOD) = IV(1)
  1269.               GO TO 560
  1270. C
  1271. C. . . . . . . . . . . . .  COMPUTE CANDIDATE STEP  . . . . . . . . . .
  1272. C
  1273.  210  STEP1 = IV(STEP)
  1274.       W1 = IV(W)
  1275.       IF (IV(MODEL) .EQ. 2) GO TO 240
  1276. C
  1277. C  ***  COMPUTE LEVENBERG-MARQUARDT STEP  ***
  1278. C
  1279.          QTR1 = IV(QTR)
  1280.          IF (IV(KALM) .GE. 0) GO TO 215
  1281.               RD1 = IV(RD)
  1282.               IF (-1 .EQ. IV(KALM)) CALL QRFACT(NN, N, P, J, V(RD1),
  1283.      1                                   IV(IPIVOT), IV(IERR), 0, V(W1))
  1284.               CALL QAPPLY(NN, N, P, J, V(QTR1), IV(IERR))
  1285.  215     H1 = IV(H)
  1286.          IF (H1 .GT. 0) GO TO 230
  1287. C
  1288. C        ***  COPY R MATRIX TO H  ***
  1289. C
  1290.               H1 = -H1
  1291.               IV(H) = H1
  1292.               K = H1
  1293.               RD1 = IV(RD)
  1294.               V(K) = V(RD1)
  1295.               IF (P .EQ. 1) GO TO 230
  1296.               DO 220 I = 2, P
  1297.                    CALL VCOPY(I-1, V(K+1), J(1,I))
  1298.                    K = K + I
  1299.                    RD1 = RD1 + 1
  1300.                    V(K) = V(RD1)
  1301.  220               CONTINUE
  1302. C
  1303.  230     G1 = IV(G)
  1304.          CALL LMSTEP(D, V(G1), IV(IERR), IV(IPIVOT), IV(KALM), P,
  1305.      1               V(QTR1), V(H1), V(STEP1), V, V(W1))
  1306.          GO TO 310
  1307. C
  1308. C  ***  COMPUTE GOLDFELD-QUANDT-TROTTER STEP (AUGMENTED MODEL)  ***
  1309. C
  1310.  240  IF (IV(H) .GT. 0) GO TO 300
  1311. C
  1312. C     ***  SET H TO  D**-1 * ( (J**T)*J + S) ) * D**-1.  ***
  1313. C
  1314.          H1 = -IV(H)
  1315.          IV(H) = H1
  1316.          S1 = IV(S)
  1317.          IF (-1 .NE. IV(KALM)) GO TO 270
  1318. C
  1319. C        ***  J IS IN ITS ORIGINAL FORM  ***
  1320. C
  1321.               DO 260 I = 1, P
  1322.                    T = ONE / D(I)
  1323.                    DO 250 K = 1, I
  1324.                         V(H1) = T*(DOTPRD(N,J(1,I),J(1,K))+V(S1)) / D(K)
  1325.                         H1 = H1 + 1
  1326.                         S1 = S1 + 1
  1327.  250                    CONTINUE
  1328.  260               CONTINUE
  1329.               GO TO 300
  1330. C
  1331. C  ***  LMSTEP HAS APPLIED QRFACT TO J  ***
  1332. C
  1333.  270     SMH = S1 - H1
  1334.          H0 = H1 - 1
  1335.          IPIV1 = IV(IPIVOT)
  1336.          T1 = ONE / D(IPIV1)
  1337.          RD0 = IV(RD) - 1
  1338.          RDOF1 = V(RD0 + 1)
  1339.          DO 290 I = 1, P
  1340.               L = IPIV0 + I
  1341.               IPIVI = IV(L)
  1342.               H1 = H0 + IPIVI*(IPIVI-1)/2
  1343.               L = H1 + IPIVI
  1344.               M = L + SMH
  1345. C             ***  V(L) = H(IPIVOT(I), IPIVOT(I))  ***
  1346. C             ***  V(M) = S(IPIVOT(I), IPIVOT(I))  ***
  1347.               T = ONE / D(IPIVI)
  1348.               RDK = RD0 + I
  1349.               E = V(RDK)**2
  1350.               IF (I .GT. 1) E = E + DOTPRD(I-1, J(1,I), J(1,I))
  1351.               V(L) = (E + V(M)) * T**2
  1352.               IF (I .EQ. 1) GO TO 290
  1353.               L = H1 + IPIV1
  1354.               IF (IPIVI .LT. IPIV1) L = L +
  1355.      1                               ((IPIV1-IPIVI)*(IPIV1+IPIVI-3))/2
  1356.               M = L + SMH
  1357. C             ***  V(L) = H(IPIVOT(I), IPIVOT(1))  ***
  1358. C             ***  V(M) = S(IPIVOT(I), IPIVOT(1))  ***
  1359.               V(L) = T * (RDOF1 * J(1,I)  +  V(M)) * T1
  1360.               IF (I .EQ. 2) GO TO 290
  1361.               IM1 = I - 1
  1362.               DO 280 K = 2, IM1
  1363.                    IPK = IPIV0 + K
  1364.                    IPIVK = IV(IPK)
  1365.                    L = H1 + IPIVK
  1366.                    IF (IPIVI .LT. IPIVK) L = L +
  1367.      1                               ((IPIVK-IPIVI)*(IPIVK+IPIVI-3))/2
  1368.                    M = L + SMH
  1369. C                  ***  V(L) = H(IPIVOT(I), IPIVOT(K))  ***
  1370. C                  ***  V(M) = S(IPIVOT(I), IPIVOT(K))  ***
  1371.                    KM1 = K - 1
  1372.                    RDK = RD0 + K
  1373.                    V(L) = T * (DOTPRD(KM1, J(1,I), J(1,K)) +
  1374.      1                            V(RDK)*J(K,I) + V(M)) / D(IPIVK)
  1375.  280               CONTINUE
  1376.  290          CONTINUE
  1377. C
  1378. C  ***  COMPUTE ACTUAL GOLDFELD-QUANDT-TROTTER STEP  ***
  1379. C
  1380.  300  H1 = IV(H)
  1381.       DIG1 = IV(DIG)
  1382.       LMAT1 = IV(LMAT)
  1383.       CALL GQTSTP(D, V(DIG1), V(H1), IV(KAGQT), V(LMAT1), P, V(STEP1),
  1384.      1            V, V(W1))
  1385. C
  1386. C
  1387. C  ***  COMPUTE R(X0 + STEP)  ***
  1388. C
  1389.  310  IF (IV(IRC) .EQ. 6) GO TO 350
  1390.       X01 = IV(X0)
  1391.       STEP1 = IV(STEP)
  1392.       CALL VAXPY(P, X, ONE, V(STEP1), V(X01))
  1393.       IV(NFCALL) = IV(NFCALL) + 1
  1394.       IV(1) = 1
  1395.       IV(TOOBIG) = 0
  1396.       GO TO 999
  1397. C
  1398. C. . . . . . . . . . . . .  ASSESS CANDIDATE STEP  . . . . . . . . . . .
  1399. C
  1400.  350  STEP1 = IV(STEP)
  1401.       LSTGST = IV(STLSTG)
  1402.       X01 = IV(X0)
  1403.       CALL ASSESS(D, IV, P, V(STEP1), V(LSTGST), V, X, V(X01))
  1404. C
  1405. C  ***  IF NECESSARY, SWITCH MODELS AND/OR RESTORE R  ***
  1406. C
  1407.       IF (IV(SWITCH) .EQ. 0) GO TO 360
  1408.          IV(H) = -IABS(IV(H))
  1409.          IV(SUSED) = IV(SUSED) + 2
  1410.          CALL VCOPY(NVSAVE, V, V(VSAVE1))
  1411.  360  IF (IV(RESTOR) .EQ. 0) GO TO 390
  1412.          RSAVE1 = IV(RSAVE)
  1413.          CALL VCOPY(N, R, V(RSAVE1))
  1414.  390  L = IV(IRC) - 4
  1415.       STPMOD = IV(MODEL)
  1416.       IF (L .GT. 0) GO TO (410,440,450,450,450,450,450,450,640,570), L
  1417. C
  1418. C  ***  DECIDE WHETHER TO CHANGE MODELS  ***
  1419. C
  1420.       E = V(PREDUC) - V(FDIF)
  1421.       SSTEP = IV(LKY)
  1422.       S1 = IV(S)
  1423.       CALL SLVMUL(P, V(SSTEP), V(S1), V(STEP1))
  1424.       STTSST = HALF * DOTPRD(P, V(STEP1), V(SSTEP))
  1425.       IF (IV(MODEL) .EQ. 1) STTSST = -STTSST
  1426.       IF (ABS(E + STTSST) * V(FUZZ) .GE. ABS(E)) GO TO 400
  1427. C
  1428. C     ***  SWITCH MODELS  ***
  1429. C
  1430.          IV(MODEL) = 3 - IV(MODEL)
  1431.          IF (IV(MODEL) .EQ. 1) IV(KAGQT) = -1
  1432.          IF (IV(MODEL) .EQ. 2 .AND. IV(KALM) .GT. 0) IV(KALM) = 0
  1433.          IF (-2 .LT. L) GO TO 480
  1434.               IV(H) = -IABS(IV(H))
  1435.               IV(SUSED) = IV(SUSED) + 2
  1436.               CALL VCOPY(NVSAVE, V(VSAVE1), V)
  1437.               GO TO 420
  1438. C
  1439.  400  IF (-3 .LT. L) GO TO 480
  1440. C
  1441. C     ***  RECOMPUTE STEP WITH DECREASED RADIUS  ***
  1442. C
  1443.          V(RADIUS) = V(RADFAC) * V(DSTNRM)
  1444.          GO TO 190
  1445. C
  1446. C  ***  RECOMPUTE STEP, SAVING V VALUES AND R IF NECESSARY  ***
  1447. C
  1448.  410  V(RADIUS) = V(RADFAC) * V(DSTNRM)
  1449.  420  IF (V(F) .GE. V(F0)) GO TO 190
  1450.       RSAVE1 = IV(RSAVE)
  1451.       CALL VCOPY(N, V(RSAVE1), R)
  1452.       GO TO 190
  1453. C
  1454. C  ***  COMPUTE STEP OF LENGTH V(LMAX0) FOR SINGULAR CONVERGENCE TEST
  1455. C
  1456.  440  V(RADIUS) = V(LMAX0)
  1457.       GO TO 210
  1458. C
  1459. C  ***  CONVERGENCE OR FALSE CONVERGENCE  ***
  1460. C
  1461.  450  IV(CNVCOD) = L
  1462.       IF (V(F) .GE. V(F0)) GO TO 700
  1463.          IF (IV(XIRC) .EQ. 14) GO TO 700
  1464.               IV(XIRC) = 14
  1465. C
  1466. C. . . . . . . . . . . .  PROCESS ACCEPTABLE STEP  . . . . . . . . . . .
  1467. C
  1468.  480  IV(COVMAT) = 0
  1469. C
  1470. C  ***  SET  LKY = (J(X0)**T) * R(X)  ***
  1471. C
  1472.       LKY1 = IV(LKY)
  1473.       IF (IV(KALM) .GE. 0) GO TO 500
  1474. C
  1475. C     ***  JACOBIAN HAS NOT BEEN MODIFIED  ***
  1476. C
  1477.          DO 490 I = 1, P
  1478.               V(LKY1) = DOTPRD(N, J(1,I), R)
  1479.               LKY1 = LKY1 + 1
  1480.  490          CONTINUE
  1481.          GO TO 510
  1482. C
  1483. C  ***  QRFACT HAS BEEN APPLIED TO J.  STORE COPY OF R IN QTR AND  ***
  1484. C  ***  APPLY Q TO IT.                                             ***
  1485. C
  1486.  500  QTR1 = IV(QTR)
  1487.       CALL VCOPY(N, V(QTR1), R)
  1488.       CALL QAPPLY(NN, N, P, J, V(QTR1), IV(IERR))
  1489. C
  1490. C  ***  MULTIPLY TOP P-VECTOR IN QTR BY PERMUTED UPPER TRIANGLE    ***
  1491. C  ***  STORED BY QRFACT IN J AND RD.                              ***
  1492. C
  1493.       RD1 = IV(RD)
  1494.       TEMP1 = IV(STLSTG)
  1495.       CALL RPTMUL(3, IV(IPIVOT), J, NN, P, V(RD1), V(QTR1), V(LKY1),
  1496.      1            V(TEMP1))
  1497. C
  1498. C  ***  SEE WHETHER TO SET V(RADFAC) BY GRADIENT TESTS  ***
  1499. C
  1500.  510  IF (IV(IRC) .NE. 3) GO TO 560
  1501.          STEP1 = IV(STEP)
  1502.          TEMP1 = IV(STLSTG)
  1503.          TEMP2 = IV(X0)
  1504. C
  1505. C     ***  SET  TEMP1 = HESSIAN * STEP  FOR USE IN GRADIENT TESTS  ***
  1506. C
  1507.          IF (STPMOD .EQ. 2) GO TO 530
  1508. C
  1509. C        ***  STEP COMPUTED USING GAUSS-NEWTON MODEL  ***
  1510. C        ***  -- QRFACT HAS BEEN APPLIED TO J         ***
  1511. C
  1512.               RD1 = IV(RD)
  1513.               CALL RPTMUL(2, IV(IPIVOT), J, NN, P, V(RD1),
  1514.      1                    V(STEP1), V(TEMP1), V(TEMP2))
  1515.               GO TO 560
  1516. C
  1517. C     ***  STEP COMPUTED USING AUGMENTED MODEL  ***
  1518. C
  1519.  530     H1 = IV(H)
  1520.          K = TEMP2
  1521.          DO 540 I = 1, P
  1522.               V(K) = D(I) * V(STEP1)
  1523.               K = K + 1
  1524.               STEP1 = STEP1 + 1
  1525.  540          CONTINUE
  1526.          CALL SLVMUL(P, V(TEMP1), V(H1), V(TEMP2))
  1527.          DO 550 I = 1, P
  1528.               V(TEMP1) = D(I) * V(TEMP1)
  1529.               TEMP1 = TEMP1 + 1
  1530.  550          CONTINUE
  1531. C
  1532. C  ***  SAVE OLD GRADIENT AND COMPUTE NEW ONE  ***
  1533. C
  1534.  560  IV(NGCALL) = IV(NGCALL) + 1
  1535.       G1 = IV(G)
  1536.       G01 = IV(W)
  1537.       CALL VCOPY(P, V(G01), V(G1))
  1538.       IV(1) = 2
  1539.       GO TO 999
  1540. C
  1541. C  ***  INITIALIZATIONS -- G0 = G - G0, ETC.  ***
  1542. C
  1543.  570  G01 = IV(W)
  1544.       G1 = IV(G)
  1545.       CALL VAXPY(P, V(G01), NEGONE, V(G01), V(G1))
  1546.       STEP1 = IV(STEP)
  1547.       TEMP1 = IV(STLSTG)
  1548.       TEMP2 = IV(X0)
  1549.       IF (IV(IRC) .NE. 3) GO TO 600
  1550. C
  1551. C  ***  SET V(RADFAC) BY GRADIENT TESTS  ***
  1552. C
  1553. C     ***  SET  TEMP1 = D**-1 * (HESSIAN * STEP  +  (G(X0) - G(X)))  ***
  1554. C
  1555.          K = TEMP1
  1556.          L = G01
  1557.          DO 580 I = 1, P
  1558.               V(K) = (V(K) - V(L)) / D(I)
  1559.               K = K + 1
  1560.               L = L + 1
  1561.  580          CONTINUE
  1562. C
  1563. C        ***  DO GRADIENT TESTS  ***
  1564. C
  1565.          IF (V2NORM(P, V(TEMP1)) .LE. V(DGNORM) * V(TUNER4))  GO TO 590
  1566.               IF (DOTPRD(P, V(G1), V(STEP1))
  1567.      1                  .GE. V(GTSTEP) * V(TUNER5))  GO TO 600
  1568.  590               V(RADFAC) = V(INCFAC)
  1569. C
  1570. C  ***  FINISH COMPUTING LKY = ((J(X) - J(X0))**T) * R  ***
  1571. C
  1572. C     ***  CURRENTLY LKY = (J(X0)**T) * R  ***
  1573. C
  1574.  600  LKY1 = IV(LKY)
  1575.       CALL VAXPY(P, V(LKY1), NEGONE, V(LKY1), V(G1))
  1576. C
  1577. C  ***  DETERMINE SIZING FACTOR V(SIZE)  ***
  1578. C
  1579. C     ***  SET TEMP1 = S * STEP  ***
  1580.       S1 = IV(S)
  1581.       CALL SLVMUL(P, V(TEMP1), V(S1), V(STEP1))
  1582. C
  1583.       T1 = ABS(DOTPRD(P, V(STEP1), V(TEMP1)))
  1584.       T = ABS(DOTPRD(P, V(STEP1), V(LKY1)))
  1585.       V(SIZE) = ONE
  1586.       IF (T .LT. T1) V(SIZE) = T / T1
  1587. C
  1588. C  ***  UPDATE S  ***
  1589. C
  1590.       CALL SLUPDT(V(S1), V(COSMIN), P, V(SIZE), V(STEP1), V(TEMP1),
  1591.      1            V(TEMP2), V(G01), V(WSCALE), V(LKY1))
  1592.       IV(1) = 2
  1593.       GO TO 150
  1594. C
  1595. C. . . . . . . . . . . . . .  MISC. DETAILS  . . . . . . . . . . . . . .
  1596. C
  1597. C  ***  BAD PARAMETERS TO ASSESS  ***
  1598. C
  1599.  640  IV(1) = 14
  1600.       GO TO 900
  1601. C
  1602. C  ***  CONVERGENCE OBTAINED -- COMPUTE COVARIANCE MATRIX IF DESIRED ***
  1603. C
  1604.  700  IF (IV(COVREQ) .EQ. 0 .AND. IV(COVPRT) .EQ. 0) GO TO 760
  1605.       IF (IV(COVMAT) .NE. 0) GO TO 760
  1606.       IF (IV(CNVCOD) .GE. 7) GO TO 760
  1607.       IV(MODE) = 0
  1608.  710  CALL COVCLC(I, D, IV, J, N, NN, P, R, V, X)
  1609.       GO TO (720, 720, 740, 750), I
  1610.  720  IV(NFCOV) = IV(NFCOV) + 1
  1611.       IV(NFCALL) = IV(NFCALL) + 1
  1612.       IV(RESTOR) = I
  1613.       IV(1) = 1
  1614.       GO TO 999
  1615. C
  1616.  730  IF (IV(RESTOR) .EQ. 1 .OR. IV(TOOBIG) .NE. 0) GO TO 710
  1617.       IV(NFGCAL) = IV(NFCALL)
  1618.  740  IV(NGCOV) = IV(NGCOV) + 1
  1619.       IV(NGCALL) = IV(NGCALL) + 1
  1620.       IV(1) = 2
  1621.       GO TO 999
  1622. C
  1623.  750  IV(MODE) = 0
  1624.       IF (IV(NITER) .EQ. 0) IV(MODE) = -1
  1625. C
  1626.  760  IV(1) = IV(CNVCOD)
  1627.       IV(CNVCOD) = 0
  1628. C
  1629. C  ***  PRINT SUMMARY OF FINAL ITERATION AND OTHER REQUESTED ITEMS  ***
  1630. C
  1631.  900  CALL ITSMRY(D, IV, P, V, X)
  1632. C
  1633.  999  RETURN
  1634. C
  1635. C  ***  LAST CARD OF NL2ITR FOLLOWS  ***
  1636.       END
  1637.       SUBROUTINE ASSESS (D, IV, P, STEP, STLSTG, V, X, X0)              ASS00010
  1638. C
  1639. C  ***  ASSESS CANDIDATE STEP (NL2SOL VERSION 2.2)  ***
  1640. C
  1641.       INTEGER P, IV(13)
  1642.       REAL D(P), STEP(P), STLSTG(P), V(35), X(P), X0(P)
  1643. C
  1644. C  ***  PURPOSE  ***
  1645. C
  1646. C        THIS SUBROUTINE IS CALLED BY AN UNCONSTRAINED MINIMIZATION
  1647. C     ROUTINE TO ASSESS THE NEXT CANDIDATE STEP.  IT MAY RECOMMEND ONE
  1648. C     OF SEVERAL COURSES OF ACTION, SUCH AS ACCEPTING THE STEP, RECOM-
  1649. C     PUTING IT USING THE SAME OR A NEW QUADRATIC MODEL, OR HALTING DUE
  1650. C     TO CONVERGENCE OR FALSE CONVERGENCE.  SEE THE RETURN CODE LISTING
  1651. C     BELOW.
  1652. C
  1653. C--------------------------  PARAMETER USAGE  --------------------------
  1654. C
  1655. C     IV (I/O) INTEGER PARAMETER AND SCRATCH VECTOR -- SEE DESCRIPTION
  1656. C             BELOW OF IV VALUES REFERENCED.
  1657. C      D (IN)  SCALE VECTOR USED IN COMPUTING V(RELDX) -- SEE BELOW.
  1658. C      P (IN)  NUMBER OF PARAMETERS BEING OPTIMIZED.
  1659. C   STEP (I/O) ON INPUT, STEP IS THE STEP TO BE ASSESSED.  IT IS UN-
  1660. C             CHANGED ON OUTPUT UNLESS A PREVIOUS STEP ACHIEVED A
  1661. C             BETTER OBJECTIVE FUNCTION REDUCTION, IN WHICH CASE STLSTG
  1662. C             WILL HAVE BEEN COPIED TO STEP.
  1663. C STLSTG (I/O) WHEN ASSESS RECOMMENDS RECOMPUTING STEP EVEN THOUGH THE
  1664. C             CURRENT (OR A PREVIOUS) STEP YIELDS AN OBJECTIVE FUNC-
  1665. C             TION DECREASE, IT SAVES IN STLSTG THE STEP THAT GAVE THE
  1666. C             BEST FUNCTION REDUCTION SEEN SO FAR (IN THE CURRENT ITERA-
  1667. C             TION).  IF THE RECOMPUTED STEP YIELDS A LARGER FUNCTION
  1668. C             VALUE, THEN STEP IS RESTORED FROM STLSTG AND
  1669. C             X = X0 + STEP IS RECOMPUTED.
  1670. C      V (I/O) REAL PARAMETER AND SCRATCH VECTOR -- SEE DESCRIPTION
  1671. C             BELOW OF V VALUES REFERENCED.
  1672. C      X (I/O) ON INPUT, X = X0 + STEP IS THE POINT AT WHICH THE OBJEC-
  1673. C             TIVE FUNCTION HAS JUST BEEN EVALUATED.  IF AN EARLIER
  1674. C             STEP YIELDED A BIGGER FUNCTION DECREASE, THEN X IS
  1675. C             RESTORED TO THE CORRESPONDING EARLIER VALUE.  OTHERWISE,
  1676. C             IF THE CURRENT STEP DOES NOT GIVE ANY FUNCTION DECREASE,
  1677. C             THEN X IS RESTORED TO X0.
  1678. C     X0 (IN)  INITIAL OBJECTIVE FUNCTION PARAMETER VECTOR (AT THE
  1679. C             START OF THE CURRENT ITERATION).
  1680. C
  1681. C  ***  IV VALUES REFERENCED  ***
  1682. C
  1683. C    IV(IRC) (I/O) ON INPUT FOR THE FIRST STEP TRIED IN A NEW ITERATION,
  1684. C             IV(IRC) SHOULD BE SET TO 3 OR 4 (THE VALUE TO WHICH IT IS
  1685. C             SET WHEN STEP IS DEFINITELY TO BE ACCEPTED).  ON INPUT
  1686. C             AFTER STEP HAS BEEN RECOMPUTED, IV(IRC) SHOULD BE
  1687. C             UNCHANGED SINCE THE PREVIOUS RETURN OF ASSESS.
  1688. C                ON OUTPUT, IV(IRC) IS A RETURN CODE HAVING ONE OF THE
  1689. C             FOLLOWING VALUES...
  1690. C                  1 = SWITCH MODELS OR TRY SMALLER STEP.
  1691. C                  2 = SWITCH MODELS OR ACCEPT STEP.
  1692. C                  3 = ACCEPT STEP AND DETERMINE V(RADFAC) BY GRADIENT
  1693. C                       TESTS.
  1694. C                  4 = ACCEPT STEP, V(RADFAC) HAS BEEN DETERMINED.
  1695. C                  5 = RECOMPUTE STEP (USING THE SAME MODEL).
  1696. C                  6 = RECOMPUTE STEP WITH RADIUS = V(LMAX0) BUT DO NOT
  1697. C                       EVAULATE THE OBJECTIVE FUNCTION.
  1698. C                  7 = X-CONVERGENCE (SEE V(XCTOL)).
  1699. C                  8 = RELATIVE FUNCTION CONVERGENCE (SEE V(RFCTOL)).
  1700. C                  9 = BOTH X- AND RELATIVE FUNCTION CONVERGENCE.
  1701. C                 10 = ABSOLUTE FUNCTION CONVERGENCE (SEE V(AFCTOL)).
  1702. C                 11 = SINGULAR CONVERGENCE (SEE V(LMAX0)).
  1703. C                 12 = FALSE CONVERGENCE (SEE V(XFTOL)).
  1704. C                 13 = IV(IRC) WAS OUT OF RANGE ON INPUT.
  1705. C             RETURN CODE I HAS PRECDENCE OVER I+1 FOR I = 9, 10, 11.
  1706. C IV(MLSTGD) (I/O) SAVED VALUE OF IV(MODEL).
  1707. C  IV(MODEL) (I/O) ON INPUT, IV(MODEL) SHOULD BE AN INTEGER IDENTIFYING
  1708. C             THE CURRENT QUADRATIC MODEL OF THE OBJECTIVE FUNCTION.
  1709. C             IF A PREVIOUS STEP YIELDED A BETTER FUNCTION REDUCTION,
  1710. C             THEN IV(MODEL) WILL BE SET TO IV(MLSTGD) ON OUTPUT.
  1711. C IV(NFCALL) (IN)  INVOCATION COUNT FOR THE OBJECTIVE FUNCTION.
  1712. C IV(NFGCAL) (I/O) VALUE OF IV(NFCALL) AT STEP THAT GAVE THE BIGGEST
  1713. C             FUNCTION REDUCTION THIS ITERATION.  IV(NFGCAL) REMAINS
  1714. C             UNCHANGED UNTIL A FUNCTION REDUCTION IS OBTAINED.
  1715. C IV(RADINC) (I/O) THE NUMBER OF RADIUS INCREASES (OR MINUS THE NUMBER
  1716. C             OF DECREASES) SO FAR THIS ITERATION.
  1717. C IV(RESTOR) (OUT) SET TO 0 UNLESS X AND V(F) HAVE BEEN RESTORED, IN
  1718. C             WHICH CASE ASSESS SETS IV(RESTOR) = 1.
  1719. C  IV(STAGE) (I/O) COUNT OF THE NUMBER OF MODELS TRIED SO FAR IN THE
  1720. C             CURRENT ITERATION.
  1721. C IV(STGLIM) (IN)  MAXIMUM NUMBER OF MODELS TO CONSIDER.
  1722. C IV(SWITCH) (OUT) SET TO 0 UNLESS A NEW MODEL IS BEING TRIED AND IT
  1723. C             GIVES A SMALLER FUNCTION VALUE THAN THE PREVIOUS MODEL,
  1724. C             IN WHICH CASE ASSESS SETS IV(SWITCH) = 1.
  1725. C IV(TOOBIG) (IN)  IS NONZERO IF STEP WAS TOO BIG (E.G. IF IT CAUSED
  1726. C             OVERFLOW).
  1727. C   IV(XIRC) (I/O) VALUE THAT IV(IRC) WOULD HAVE IN THE ABSENCE OF
  1728. C             CONVERGENCE, FALSE CONVERGENCE, AND OVERSIZED STEPS.
  1729. C
  1730. C  ***  V VALUES REFERENCED  ***
  1731. C
  1732. C V(AFCTOL) (IN)  ABSOLUTE FUNCTION CONVERGENCE TOLERANCE.  IF THE
  1733. C             ABSOLUTE VALUE OF THE CURRENT FUNCTION VALUE V(F) IS LESS
  1734. C             THAN V(AFCTOL), THEN ASSESS RETURNS WITH IV(IRC) = 10.
  1735. C V(DECFAC) (IN)  FACTOR BY WHICH TO DECREASE RADIUS WHEN IV(TOOBIG) IS
  1736. C             NONZERO.
  1737. C V(DSTNRM) (IN)  THE 2-NORM OF D*STEP.
  1738. C V(DSTSAV) (I/O) VALUE OF V(DSTNRM) ON SAVED STEP.
  1739. C   V(DST0) (IN)  THE 2-NORM OF D TIMES THE NEWTON STEP (WHEN DEFINED,
  1740. C             I.E., FOR V(NREDUC) .GE. 0).
  1741. C      V(F) (I/O) ON BOTH INPUT AND OUTPUT, V(F) IS THE OBJECTIVE FUNC-
  1742. C             TION VALUE AT X.  IF X IS RESTORED TO A PREVIOUS VALUE,
  1743. C             THEN V(F) IS RESTORED TO THE CORRESPONDING VALUE.
  1744. C   V(FDIF) (OUT) THE FUNCTION REDUCTION V(F0) - V(F) (FOR THE OUTPUT
  1745. C             VALUE OF V(F) IF AN EARLIER STEP GAVE A BIGGER FUNCTION
  1746. C             DECREASE, AND FOR THE INPUT VALUE OF V(F) OTHERWISE).
  1747. C V(FLSTGD) (I/O) SAVED VALUE OF V(F).
  1748. C     V(F0) (IN)  OBJECTIVE FUNCTION VALUE AT START OF ITERATION.
  1749. C V(GTSLST) (I/O) VALUE OF V(GTSTEP) ON SAVED STEP.
  1750. C V(GTSTEP) (IN)  INNER PRODUCT BETWEEN STEP AND GRADIENT.
  1751. C V(INCFAC) (IN)  MINIMUM FACTOR BY WHICH TO INCREASE RADIUS.
  1752. C  V(LMAX0) (IN)  MAXIMUM REASONABLE STEP SIZE (AND INITIAL STEP BOUND).
  1753. C             IF THE ACTUAL FUNCTION DECREASE IS NO MORE THAN TWICE
  1754. C             WHAT WAS PREDICTED, IF A RETURN WITH IV(IRC) = 7, 8, 9,
  1755. C             OR 10 DOES NOT OCCUR, IF V(DSTNRM) .GT. V(LMAX0), AND IF
  1756. C             V(PREDUC) .LE. V(RFCTOL) * ABS(V(F0)), THEN ASSESS RE-
  1757. C             TURNS WITH IV(IRC) = 11.  IF SO DOING APPEARS WORTHWHILE,
  1758. C             THEN ASSESS REPEATS THIS TEST WITH V(PREDUC) COMPUTED FOR
  1759. C             A STEP OF LENGTH V(LMAX0) (BY A RETURN WITH IV(IRC) = 6).
  1760. C V(NREDUC) (I/O)  FUNCTION REDUCTION PREDICTED BY QUADRATIC MODEL FOR
  1761. C             NEWTON STEP.  IF ASSESS IS CALLED WITH IV(IRC) = 6, I.E.,
  1762. C             IF V(PREDUC) HAS BEEN COMPUTED WITH RADIUS = V(LMAX0) FOR
  1763. C             USE IN THE SINGULAR CONVERVENCE TEST, THEN V(NREDUC) IS
  1764. C             SET TO -V(PREDUC) BEFORE THE LATTER IS RESTORED.
  1765. C V(PLSTGD) (I/O) VALUE OF V(PREDUC) ON SAVED STEP.
  1766. C V(PREDUC) (I/O) FUNCTION REDUCTION PREDICTED BY QUADRATIC MODEL FOR
  1767. C             CURRENT STEP.
  1768. C V(RADFAC) (OUT) FACTOR TO BE USED IN DETERMINING THE NEW RADIUS,
  1769. C             WHICH SHOULD BE V(RADFAC)*DST, WHERE  DST  IS EITHER THE
  1770. C             OUTPUT VALUE OF V(DSTNRM) OR THE 2-NORM OF
  1771. C             DIAG(NEWD)*STEP  FOR THE OUTPUT VALUE OF STEP AND THE
  1772. C             UPDATED VERSION, NEWD, OF THE SCALE VECTOR D.  FOR
  1773. C             IV(IRC) = 3, V(RADFAC) = 1.0 IS RETURNED.
  1774. C V(RDFCMN) (IN)  MINIMUM VALUE FOR V(RADFAC) IN TERMS OF THE INPUT
  1775. C             VALUE OF V(DSTNRM) -- SUGGESTED VALUE = 0.1.
  1776. C V(RDFCMX) (IN)  MAXIMUM VALUE FOR V(RADFAC) -- SUGGESTED VALUE = 4.0.
  1777. C  V(RELDX) (OUT) SCALED RELATIVE CHANGE IN X CAUSED BY STEP, COMPUTED
  1778. C             BY FUNCTION  RELDST  AS
  1779. C                 MAX (D(I)*ABS(X(I)-X0(I)), 1 .LE. I .LE. P) /
  1780. C                    MAX (D(I)*(ABS(X(I))+ABS(X0(I))), 1 .LE. I .LE. P).
  1781. C             IF AN ACCEPTABLE STEP IS RETURNED, THEN V(RELDX) IS COM-
  1782. C             PUTED USING THE OUTPUT (POSSIBLY RESTORED) VALUES OF X
  1783. C             AND STEP.  OTHERWISE IT IS COMPUTED USING THE INPUT
  1784. C             VALUES.
  1785. C V(RFCTOL) (IN)  RELATIVE FUNCTION CONVERGENCE TOLERANCE.  IF THE
  1786. C             ACTUAL FUNCTION REDUCTION IS AT MOST TWICE WHAT WAS PRE-
  1787. C             DICTED AND  V(NREDUC) .LE. V(RFCTOL)*ABS(V(F0)),  THEN
  1788. C             ASSESS RETURNS WITH IV(IRC) = 8 OR 9.  SEE ALSO V(LMAX0).
  1789. C V(STPPAR) (IN)  MARQUARDT PARAMETER -- 0 MEANS FULL NEWTON STEP.
  1790. C V(TUNER1) (IN)  TUNING CONSTANT USED TO DECIDE IF THE FUNCTION
  1791. C             REDUCTION WAS MUCH LESS THAN EXPECTED.  SUGGESTED
  1792. C             VALUE = 0.1.
  1793. C V(TUNER2) (IN)  TUNING CONSTANT USED TO DECIDE IF THE FUNCTION
  1794. C             REDUCTION WAS LARGE ENOUGH TO ACCEPT STEP.  SUGGESTED
  1795. C             VALUE = 10**-4.
  1796. C V(TUNER3) (IN)  TUNING CONSTANT USED TO DECIDE IF THE RADIUS
  1797. C             SHOULD BE INCREASED.  SUGGESTED VALUE = 0.75.
  1798. C  V(XCTOL) (IN)  X-CONVERGENCE CRITERION.  IF STEP IS A NEWTON STEP
  1799. C             (V(STPPAR) = 0) HAVING V(RELDX) .LE. V(XCTOL) AND GIVING
  1800. C             AT MOST TWICE THE PREDICTED FUNCTION DECREASE, THEN
  1801. C             ASSESS RETURNS IV(IRC) = 7 OR 9.
  1802. C  V(XFTOL) (IN)  FALSE CONVERGENCE TOLERANCE.  IF STEP GAVE NO OR ONLY
  1803. C             A SMALL FUNCTION DECREASE AND V(RELDX) .LE. V(XFTOL),
  1804. C             THEN ASSESS RETURNS WITH IV(IRC) = 12.
  1805. C
  1806. C-------------------------------  NOTES  -------------------------------
  1807. C
  1808. C  ***  APPLICATION AND USAGE RESTRICTIONS  ***
  1809. C
  1810. C        THIS ROUTINE IS CALLED AS PART OF THE NL2SOL (NONLINEAR
  1811. C     LEAST-SQUARES) PACKAGE.  IT MAY BE USED IN ANY UNCONSTRAINED
  1812. C     MINIMIZATION SOLVER THAT USES DOGLEG, GOLDFELD-QUANDT-TROTTER,
  1813. C     OR LEVENBERG-MARQUARDT STEPS.
  1814. C
  1815. C  ***  ALGORITHM NOTES  ***
  1816. C
  1817. C        SEE (1) FOR FURTHER DISCUSSION OF THE ASSESSING AND MODEL
  1818. C     SWITCHING STRATEGIES.  WHILE NL2SOL CONSIDERS ONLY TWO MODELS,
  1819. C     ASSESS IS DESIGNED TO HANDLE ANY NUMBER OF MODELS.
  1820. C
  1821. C  ***  USAGE NOTES  ***
  1822. C
  1823. C        ON THE FIRST CALL OF AN ITERATION, ONLY THE I/O VARIABLES
  1824. C     STEP, X, IV(IRC), IV(MODEL), V(F), V(DSTNRM), V(GTSTEP), AND
  1825. C     V(PREDUC) NEED HAVE BEEN INITIALIZED.  BETWEEN CALLS, NO I/O
  1826. C     VALUES EXECPT STEP, X, IV(MODEL), V(F) AND THE STOPPING TOLER-
  1827. C     ANCES SHOULD BE CHANGED.
  1828. C        AFTER A RETURN FOR CONVERGENCE OR FALSE CONVERGENCE, ONE CAN
  1829. C     CHANGE THE STOPPING TOLERANCES AND CALL ASSESS AGAIN, IN WHICH
  1830. C     CASE THE STOPPING TESTS WILL BE REPEATED.
  1831. C
  1832. C  ***  REFERENCES  ***
  1833. C
  1834. C     (1) DENNIS, J.E., JR., GAY, D.M., AND WELSCH, R.E. (1981),
  1835. C        AN ADAPTIVE NONLINEAR LEAST-SQUARES ALGORITHM,
  1836. C        ACM TRANS. MATH. SOFTWARE, VOL. 7, NO. 3.
  1837. C
  1838. C     (2) POWELL, M.J.D. (1970)  A FORTRAN SUBROUTINE FOR SOLVING
  1839. C        SYSTEMS OF NONLINEAR ALGEBRAIC EQUATIONS, IN NUMERICAL
  1840. C        METHODS FOR NONLINEAR ALGEBRAIC EQUATIONS, EDITED BY
  1841. C        P. RABINOWITZ, GORDON AND BREACH, LONDON.
  1842. C
  1843. C  ***  HISTORY  ***
  1844. C
  1845. C        JOHN DENNIS DESIGNED MUCH OF THIS ROUTINE, STARTING WITH
  1846. C     IDEAS IN (2). ROY WELSCH SUGGESTED THE MODEL SWITCHING STRATEGY.
  1847. C        DAVID GAY AND STEPHEN PETERS CAST THIS SUBROUTINE INTO A MORE
  1848. C     PORTABLE FORM (WINTER 1977), AND DAVID GAY CAST IT INTO ITS
  1849. C     PRESENT FORM (FALL 1978).
  1850. C
  1851. C  ***  GENERAL  ***
  1852. C
  1853. C     THIS SUBROUTINE WAS WRITTEN IN CONNECTION WITH RESEARCH
  1854. C     SUPPORTED BY THE NATIONAL SCIENCE FOUNDATION UNDER GRANTS
  1855. C     MCS-7600324, DCR75-10143, 76-14311DSS, MCS76-11989, AND
  1856. C     MCS-7906671.
  1857. C
  1858. C------------------------  EXTERNAL QUANTITIES  ------------------------
  1859. C
  1860. C  ***  EXTERNAL FUNCTIONS AND SUBROUTINES  ***
  1861. C
  1862.       EXTERNAL RELDST, VCOPY
  1863.       REAL RELDST
  1864. C
  1865. C VCOPY.... COPIES ONE VECTOR TO ANOTHER.
  1866. C
  1867. C  ***  INTRINSIC FUNCTIONS  ***
  1868. C/+
  1869.       INTEGER IABS
  1870.       REAL ABS, AMAX1
  1871. C/
  1872. C  ***  NO COMMON BLOCKS  ***
  1873. C
  1874. C--------------------------  LOCAL VARIABLES  --------------------------
  1875. C
  1876.       LOGICAL GOODX
  1877.       INTEGER I, NFC
  1878.       REAL EMAX, GTS, HALF, ONE, RELDX1, RFAC1, TWO, XMAX,
  1879.      1                 ZERO
  1880. C
  1881. C  ***  SUBSCRIPTS FOR IV AND V  ***
  1882. C
  1883.       INTEGER AFCTOL, DECFAC, DSTNRM, DSTSAV, DST0, F, FDIF, FLSTGD, F0,
  1884.      1        GTSLST, GTSTEP, INCFAC, IRC, LMAX0, MLSTGD, MODEL, NFCALL,
  1885.      2        NFGCAL, NREDUC, PLSTGD, PREDUC, RADFAC, RADINC, RDFCMN,
  1886.      3        RDFCMX, RELDX, RESTOR, RFCTOL, STAGE, STGLIM, STPPAR,
  1887.      4        SWITCH, TOOBIG, TUNER1, TUNER2, TUNER3, XCTOL, XFTOL,
  1888.      5        XIRC
  1889. C
  1890. C  ***  DATA INITIALIZATIONS  ***
  1891. C
  1892. C/6
  1893.       DATA HALF/0.5E+0/, ONE/1.E+0/, TWO/2.E+0/, ZERO/0.E+0/
  1894. C/7
  1895. C     PARAMETER (HALF=0.5D+0, ONE=1.D+0, TWO=2.D+0, ZERO=0.D+0)
  1896. C/
  1897. C
  1898. C/6
  1899.       DATA IRC/3/, MLSTGD/4/, MODEL/5/, NFCALL/6/,
  1900.      1     NFGCAL/7/, RADINC/8/, RESTOR/9/, STAGE/10/,
  1901.      2     STGLIM/11/, SWITCH/12/, TOOBIG/2/, XIRC/13/
  1902. C/7
  1903. C     PARAMETER (IRC=3, MLSTGD=4, MODEL=5, NFCALL=6,
  1904. C    1     NFGCAL=7, RADINC=8, RESTOR=9, STAGE=10,
  1905. C    2     STGLIM=11, SWITCH=12, TOOBIG=2, XIRC=13)
  1906. C/
  1907. C/6
  1908.       DATA AFCTOL/31/, DECFAC/22/, DSTNRM/2/, DST0/3/,
  1909.      1     DSTSAV/18/, F/10/, FDIF/11/, FLSTGD/12/, F0/13/,
  1910.      2     GTSLST/14/, GTSTEP/4/, INCFAC/23/,
  1911.      3     LMAX0/35/, NREDUC/6/, PLSTGD/15/, PREDUC/7/,
  1912.      4     RADFAC/16/, RDFCMN/24/, RDFCMX/25/,
  1913.      5     RELDX/17/, RFCTOL/32/, STPPAR/5/, TUNER1/26/,
  1914.      6     TUNER2/27/, TUNER3/28/, XCTOL/33/, XFTOL/34/
  1915. C/7
  1916. C     PARAMETER (AFCTOL=31, DECFAC=22, DSTNRM=2, DST0=3,
  1917. C    1     DSTSAV=18, F=10, FDIF=11, FLSTGD=12, F0=13,
  1918. C    2     GTSLST=14, GTSTEP=4, INCFAC=23,
  1919. C    3     LMAX0=35, NREDUC=6, PLSTGD=15, PREDUC=7,
  1920. C    4     RADFAC=16, RDFCMN=24, RDFCMX=25,
  1921. C    5     RELDX=17, RFCTOL=32, STPPAR=5, TUNER1=26,
  1922. C    6     TUNER2=27, TUNER3=28, XCTOL=33, XFTOL=34)
  1923. C/
  1924. C
  1925. C+++++++++++++++++++++++++++++++  BODY  ++++++++++++++++++++++++++++++++
  1926. C
  1927.       NFC = IV(NFCALL)
  1928.       IV(SWITCH) = 0
  1929.       IV(RESTOR) = 0
  1930.       RFAC1 = ONE
  1931.       GOODX = .TRUE.
  1932.       I = IV(IRC)
  1933.       IF (I .GE. 1 .AND. I .LE. 12)
  1934.      1             GO TO (20,30,10,10,40,360,290,290,290,290,290,140), I
  1935.          IV(IRC) = 13
  1936.          GO TO 999
  1937. C
  1938. C  ***  INITIALIZE FOR NEW ITERATION  ***
  1939. C
  1940.  10   IV(STAGE) = 1
  1941.       IV(RADINC) = 0
  1942.       V(FLSTGD) = V(F0)
  1943.       IF (IV(TOOBIG) .EQ. 0) GO TO 90
  1944.          IV(STAGE) = -1
  1945.          IV(XIRC) = I
  1946.          GO TO 60
  1947. C
  1948. C  ***  STEP WAS RECOMPUTED WITH NEW MODEL OR SMALLER RADIUS  ***
  1949. C  ***  FIRST DECIDE WHICH  ***
  1950. C
  1951.  20   IF (IV(MODEL) .NE. IV(MLSTGD)) GO TO 30
  1952. C        ***  OLD MODEL RETAINED, SMALLER RADIUS TRIED  ***
  1953. C        ***  DO NOT CONSIDER ANY MORE NEW MODELS THIS ITERATION  ***
  1954.          IV(STAGE) = IV(STGLIM)
  1955.          IV(RADINC) = -1
  1956.          GO TO 90
  1957. C
  1958. C  ***  A NEW MODEL IS BEING TRIED.  DECIDE WHETHER TO KEEP IT.  ***
  1959. C
  1960.  30   IV(STAGE) = IV(STAGE) + 1
  1961. C
  1962. C     ***  NOW WE ADD THE POSSIBILTIY THAT STEP WAS RECOMPUTED WITH  ***
  1963. C     ***  THE SAME MODEL, PERHAPS BECAUSE OF AN OVERSIZED STEP.     ***
  1964. C
  1965.  40   IF (IV(STAGE) .GT. 0) GO TO 50
  1966. C
  1967. C        ***  STEP WAS RECOMPUTED BECAUSE IT WAS TOO BIG.  ***
  1968. C
  1969.          IF (IV(TOOBIG) .NE. 0) GO TO 60
  1970. C
  1971. C        ***  RESTORE IV(STAGE) AND PICK UP WHERE WE LEFT OFF.  ***
  1972. C
  1973.          IV(STAGE) = -IV(STAGE)
  1974.          I = IV(XIRC)
  1975.          GO TO (20, 30, 90, 90, 70), I
  1976. C
  1977.  50   IF (IV(TOOBIG) .EQ. 0) GO TO 70
  1978. C
  1979. C  ***  HANDLE OVERSIZE STEP  ***
  1980. C
  1981.       IF (IV(RADINC) .GT. 0) GO TO 80
  1982.          IV(STAGE) = -IV(STAGE)
  1983.          IV(XIRC) = IV(IRC)
  1984. C
  1985.  60      V(RADFAC) = V(DECFAC)
  1986.          IV(RADINC) = IV(RADINC) - 1
  1987.          IV(IRC) = 5
  1988.          GO TO 999
  1989. C
  1990.  70   IF (V(F) .LT. V(FLSTGD)) GO TO 90
  1991. C
  1992. C     *** THE NEW STEP IS A LOSER.  RESTORE OLD MODEL.  ***
  1993. C
  1994.       IF (IV(MODEL) .EQ. IV(MLSTGD)) GO TO 80
  1995.          IV(MODEL) = IV(MLSTGD)
  1996.          IV(SWITCH) = 1
  1997. C
  1998. C     ***  RESTORE STEP, ETC. ONLY IF A PREVIOUS STEP DECREASED V(F).
  1999. C
  2000.  80   IF (V(FLSTGD) .GE. V(F0)) GO TO 90
  2001.          IV(RESTOR) = 1
  2002.          V(F) = V(FLSTGD)
  2003.          V(PREDUC) = V(PLSTGD)
  2004.          V(GTSTEP) = V(GTSLST)
  2005.          IF (IV(SWITCH) .EQ. 0) RFAC1 = V(DSTNRM) / V(DSTSAV)
  2006.          V(DSTNRM) = V(DSTSAV)
  2007.          NFC = IV(NFGCAL)
  2008.          GOODX = .FALSE.
  2009. C
  2010. C
  2011. C  ***  COMPUTE RELATIVE CHANGE IN X BY CURRENT STEP  ***
  2012. C
  2013.  90   RELDX1 = RELDST(P, D, X, X0)
  2014. C
  2015. C  ***  RESTORE X AND STEP IF NECESSARY  ***
  2016. C
  2017.       IF (GOODX) GO TO 105
  2018.       DO 100 I = 1, P
  2019.          STEP(I) = STLSTG(I)
  2020.          X(I) = X0(I) + STLSTG(I)
  2021.  100     CONTINUE
  2022. C
  2023.  105  V(FDIF) = V(F0) - V(F)
  2024.       IF (V(FDIF) .GT. V(TUNER2) * V(PREDUC)) GO TO 120
  2025. C
  2026. C        ***  NO (OR ONLY A TRIVIAL) FUNCTION DECREASE
  2027. C        ***  -- SO TRY NEW MODEL OR SMALLER RADIUS
  2028. C
  2029.          V(RELDX) = RELDX1
  2030.          IF (V(F) .LT. V(F0)) GO TO 110
  2031.               IV(MLSTGD) = IV(MODEL)
  2032.               V(FLSTGD) = V(F)
  2033.               V(F) = V(F0)
  2034.               CALL VCOPY(P, X, X0)
  2035.               IV(RESTOR) = 1
  2036.               GO TO 115
  2037.  110     IV(NFGCAL) = NFC
  2038.  115     IV(IRC) = 1
  2039.          IF (IV(STAGE) .LT. IV(STGLIM)) GO TO 130
  2040.               IV(IRC) = 5
  2041.               IV(RADINC) = IV(RADINC) - 1
  2042.               GO TO 130
  2043. C
  2044. C  ***  NONTRIVIAL FUNCTION DECREASE ACHIEVED  ***
  2045. C
  2046.  120  IV(NFGCAL) = NFC
  2047.       RFAC1 = ONE
  2048.       IF (GOODX) V(RELDX) = RELDX1
  2049.       V(DSTSAV) = V(DSTNRM)
  2050.       IF (V(FDIF) .GT. V(PREDUC)*V(TUNER1)) GO TO 200
  2051. C
  2052. C  ***  DECREASE WAS MUCH LESS THAN PREDICTED -- EITHER CHANGE MODELS
  2053. C  ***  OR ACCEPT STEP WITH DECREASED RADIUS.
  2054. C
  2055.       IF (IV(STAGE) .GE. IV(STGLIM)) GO TO 125
  2056. C        ***  CONSIDER SWITCHING MODELS  ***
  2057.          IV(IRC) = 2
  2058.          GO TO 130
  2059. C
  2060. C     ***  ACCEPT STEP WITH DECREASED RADIUS  ***
  2061. C
  2062.  125  IV(IRC) = 4
  2063. C
  2064. C  ***  SET V(RADFAC) TO FLETCHER*S DECREASE FACTOR  ***
  2065. C
  2066.  130  IV(XIRC) = IV(IRC)
  2067.       EMAX = V(GTSTEP) + V(FDIF)
  2068.       V(RADFAC) = HALF * RFAC1
  2069.       IF (EMAX .LT. V(GTSTEP)) V(RADFAC) = RFAC1 * AMAX1(V(RDFCMN),
  2070.      1                                           HALF * V(GTSTEP)/EMAX)
  2071. C
  2072. C  ***  DO FALSE CONVERGENCE TEST  ***
  2073. C
  2074.  140  IF (V(RELDX) .LE. V(XFTOL)) GO TO 160
  2075.          IV(IRC) = IV(XIRC)
  2076.          IF (V(F) .LT. V(F0)) GO TO 230
  2077.               GO TO 300
  2078. C
  2079.  160  IV(IRC) = 12
  2080.       GO TO 310
  2081. C
  2082. C  ***  HANDLE GOOD FUNCTION DECREASE  ***
  2083. C
  2084.  200  IF (V(FDIF) .LT. (-V(TUNER3) * V(GTSTEP))) GO TO 260
  2085. C
  2086. C     ***  INCREASING RADIUS LOOKS WORTHWHILE.  SEE IF WE JUST
  2087. C     ***  RECOMPUTED STEP WITH A DECREASED RADIUS OR RESTORED STEP
  2088. C     ***  AFTER RECOMPUTING IT WITH A LARGER RADIUS.
  2089. C
  2090.       IF (IV(RADINC) .LT. 0) GO TO 260
  2091.       IF (IV(RESTOR) .EQ. 1) GO TO 260
  2092. C
  2093. C        ***  WE DID NOT.  TRY A LONGER STEP UNLESS THIS WAS A NEWTON
  2094. C        ***  STEP.
  2095. C
  2096.          V(RADFAC) = V(RDFCMX)
  2097.          GTS = V(GTSTEP)
  2098.          IF (V(FDIF) .LT. (HALF/V(RADFAC) - ONE) * GTS)
  2099.      1            V(RADFAC) = AMAX1(V(INCFAC), HALF*GTS/(GTS + V(FDIF)))
  2100.          IV(IRC) = 4
  2101.          IF (V(STPPAR) .EQ. ZERO) GO TO 300
  2102. C             ***  STEP WAS NOT A NEWTON STEP.  RECOMPUTE IT WITH
  2103. C             ***  A LARGER RADIUS.
  2104.               IV(IRC) = 5
  2105.               IV(RADINC) = IV(RADINC) + 1
  2106. C
  2107. C  ***  SAVE VALUES CORRESPONDING TO GOOD STEP  ***
  2108. C
  2109.  230  V(FLSTGD) = V(F)
  2110.       IV(MLSTGD) = IV(MODEL)
  2111.       CALL VCOPY(P, STLSTG, STEP)
  2112.       V(DSTSAV) = V(DSTNRM)
  2113.       IV(NFGCAL) = NFC
  2114.       V(PLSTGD) = V(PREDUC)
  2115.       V(GTSLST) = V(GTSTEP)
  2116.       GO TO 300
  2117. C
  2118. C  ***  ACCEPT STEP WITH RADIUS UNCHANGED  ***
  2119. C
  2120.  260  V(RADFAC) = ONE
  2121.       IV(IRC) = 3
  2122.       GO TO 300
  2123. C
  2124. C  ***  COME HERE FOR A RESTART AFTER CONVERGENCE  ***
  2125. C
  2126.  290  IV(IRC) = IV(XIRC)
  2127.       IF (V(DSTSAV) .GE. ZERO) GO TO 310
  2128.          IV(IRC) = 12
  2129.          GO TO 310
  2130. C
  2131. C  ***  PERFORM CONVERGENCE TESTS  ***
  2132. C
  2133.  300  IV(XIRC) = IV(IRC)
  2134.  310  IF (ABS(V(F)) .LT. V(AFCTOL)) IV(IRC) = 10
  2135.       IF (HALF * V(FDIF) .GT. V(PREDUC)) GO TO 999
  2136.       EMAX = V(RFCTOL) * ABS(V(F0))
  2137.       IF (V(DSTNRM) .GT. V(LMAX0) .AND. V(PREDUC) .LE. EMAX)
  2138.      1                       IV(IRC) = 11
  2139.       IF (V(DST0) .LT. ZERO) GO TO 320
  2140.       I = 0
  2141.       IF ((V(NREDUC) .GT. ZERO .AND. V(NREDUC) .LE. EMAX) .OR.
  2142.      1    (V(NREDUC) .EQ. ZERO. AND. V(PREDUC) .EQ. ZERO))  I = 2
  2143.       IF (V(STPPAR) .EQ. ZERO .AND. V(RELDX) .LE. V(XCTOL)
  2144.      1                        .AND. GOODX)                  I = I + 1
  2145.       IF (I .GT. 0) IV(IRC) = I + 6
  2146. C
  2147. C  ***  CONSIDER RECOMPUTING STEP OF LENGTH V(LMAX0) FOR SINGULAR
  2148. C  ***  CONVERGENCE TEST.
  2149. C
  2150.  320  IF (IABS(IV(IRC)-3) .GT. 2 .AND. IV(IRC) .NE. 12) GO TO 999
  2151.       IF (V(DSTNRM) .GT. V(LMAX0)) GO TO 330
  2152.          IF (V(PREDUC) .GE. EMAX) GO TO 999
  2153.               IF (V(DST0) .LE. ZERO) GO TO 340
  2154.                    IF (HALF * V(DST0) .LE. V(LMAX0)) GO TO 999
  2155.                         GO TO 340
  2156.  330  IF (HALF * V(DSTNRM) .LE. V(LMAX0)) GO TO 999
  2157.       XMAX = V(LMAX0) / V(DSTNRM)
  2158.       IF (XMAX * (TWO - XMAX) * V(PREDUC) .GE. EMAX) GO TO 999
  2159.  340  IF (V(NREDUC) .LT. ZERO) GO TO 370
  2160. C
  2161. C  ***  RECOMPUTE V(PREDUC) FOR USE IN SINGULAR CONVERGENCE TEST  ***
  2162. C
  2163.       V(GTSLST) = V(GTSTEP)
  2164.       V(DSTSAV) = V(DSTNRM)
  2165.       IF (IV(IRC) .EQ. 12) V(DSTSAV) = -V(DSTSAV)
  2166.       V(PLSTGD) = V(PREDUC)
  2167.       IV(IRC) = 6
  2168.       CALL VCOPY(P, STLSTG, STEP)
  2169.       GO TO 999
  2170. C
  2171. C  ***  PERFORM SINGULAR CONVERGENCE TEST WITH RECOMPUTED V(PREDUC)  ***
  2172. C
  2173.  360  V(GTSTEP) = V(GTSLST)
  2174.       V(DSTNRM) = ABS(V(DSTSAV))
  2175.       CALL VCOPY(P, STEP, STLSTG)
  2176.       IV(IRC) = IV(XIRC)
  2177.       IF (V(DSTSAV) .LE. ZERO) IV(IRC) = 12
  2178.       V(NREDUC) = -V(PREDUC)
  2179.       V(PREDUC) = V(PLSTGD)
  2180.  370  IF (-V(NREDUC) .LE. V(RFCTOL) * ABS(V(F0))) IV(IRC) = 11
  2181. C
  2182.  999  RETURN
  2183. C
  2184. C  ***  LAST CARD OF ASSESS FOLLOWS  ***
  2185.       END
  2186.       SUBROUTINE COVCLC(COVIRC, D, IV, J, N, NN, P, R, V, X)            COV00010
  2187. C
  2188. C  ***  COMPUTE COVARIANCE MATRIX FOR NL2ITR (NL2SOL VERSION 2.2)  ***
  2189. C
  2190. C  ***  LET K = IABS(IV(COVREQ).  FOR K .LE. 2, A FINITE-DIFFERENCE
  2191. C  ***  HESSIAN H IS COMPUTED (USING FUNC. AND GRAD. VALUES IF
  2192. C  ***  IV(COVREQ) IS NONNEGATIVE, AND USING ONLY FUNC. VALUES IF
  2193. C  ***  IV(COVREQ) IS NEGATIVE).  FOR SCALE = 2*F(X) / MAX(1, N-P),
  2194. C  ***  WHERE 2*F(X) IS THE RESIDUAL SUM OF SQUARES, COVCLC COMPUTES...
  2195. C  ***             K = 0 OR 1...  SCALE * H**-1 * (J**T * J) * H**-1.
  2196. C  ***             K = 2...  SCALE * H**-1.
  2197. C  ***             K .GE. 3...  SCALE * (J**T * J)**-1.
  2198. C
  2199. C  ***  PARAMETER DECLARATIONS  ***
  2200. C
  2201.       INTEGER COVIRC, IV(1), N, NN, P
  2202.       REAL D(P), J(NN,P), R(N), V(1), X(P)
  2203. C     DIMENSION IV(*), V(*)
  2204. C
  2205. C  ***  LOCAL VARIABLES  ***
  2206. C
  2207.       LOGICAL HAVEJ
  2208.       INTEGER COV, GP, GSAVE1, G1, HC, HMI, HPI, HPM, I, IPIVI, IPIVK,
  2209.      1        IP1, IRC, K, KIND, KL, L, M, MM1, MM1O2, PP1O2, QTR1,
  2210.      2        RD1, STPI, STPM, STP0, WL, W0, W1
  2211.       REAL DEL, HALF, NEGPT5, ONE, T, TWO, WK, ZERO
  2212. C
  2213. C  ***  INTRINSIC FUNCTIONS  ***
  2214. C/+
  2215.       INTEGER IABS, MAX0
  2216.       REAL ABS, AMAX1, FLOAT, SQRT
  2217. C/
  2218. C  ***  EXTERNAL SUBROUTINES  ***
  2219. C
  2220.       EXTERNAL LINVRT, LITVMU, LIVMUL, LSQRT, LTSQAR, QRFACT,
  2221.      1         VCOPY, VSCOPY
  2222. C
  2223. C LINVRT... INVERT LOWER TRIANGULAR MATRIX.
  2224. C LITVMU... APPLY INVERSE-TRANSPOSE OF COMPACT LOWER TRIANG. MATRIX.
  2225. C LIVMUL... APPLY INVERSE OF COMPACT LOWER TRIANG. MATRIX.
  2226. C LSQRT.... COMPUTE CHOLESKY FACTOR OF (LOWER TRINAG. OF) A SYM. MATRIX.
  2227. C LTSQAR... GIVEN LOWER TRIANG. MATRIX L, COMPUTE (L**T)*L.
  2228. C QRFACT... COMPUTE QR DECOMPOSITION OF A MATRIX.
  2229. C VCOPY.... COPY ONE VECTOR TO ANOTHER.
  2230. C VSCOPY... SET ALL ELEMENTS OF A VECTOR TO A SCALAR.
  2231. C
  2232. C  ***  SUBSCRIPTS FOR IV AND V  ***
  2233. C
  2234.       INTEGER COVMAT, COVREQ, DELTA, DELTA0, DLTFDC, F, FX, G, H, IERR,
  2235.      1        IPIVOT, IPIV0, KAGQT, KALM, LMAT, MODE, NFGCAL, QTR,
  2236.      2        RD, RSAVE, SAVEI, SWITCH, TOOBIG, W, XMSAVE
  2237. C
  2238. C/6
  2239.       DATA HALF/0.5E+0/, NEGPT5/-0.5E+0/, ONE/1.E+0/, TWO/2.E+0/,
  2240.      1     ZERO/0.E+0/
  2241. C/7
  2242. C     PARAMETER (HALF=0.5D+0, NEGPT5=-0.5D+0, ONE=1.D+0, TWO=2.D+0,
  2243. C    1     ZERO=0.D+0)
  2244. C/
  2245. C
  2246. C/6
  2247.       DATA COVMAT/26/, COVREQ/15/, DELTA/50/, DELTA0/44/,
  2248.      1     DLTFDC/40/, F/10/, FX/46/, G/28/, H/44/, IERR/32/,
  2249.      2     IPIVOT/61/, IPIV0/60/, KAGQT/35/, KALM/36/,
  2250.      3     LMAT/58/, MODE/38/, NFGCAL/7/, QTR/49/,
  2251.      4     RD/51/, RSAVE/52/, SAVEI/54/, SWITCH/12/,
  2252.      5     TOOBIG/2/, W/59/, XMSAVE/49/
  2253. C/7
  2254. C     PARAMETER (COVMAT=26, COVREQ=15, DELTA=50, DELTA0=44,
  2255. C    1     DLTFDC=40, F=10, FX=46, G=28, H=44, IERR=32,
  2256. C    2     IPIVOT=61, IPIV0=60, KAGQT=35, KALM=36,
  2257. C    3     LMAT=58, MODE=38, NFGCAL=7, QTR=49,
  2258. C    4     RD=51, RSAVE=52, SAVEI=54, SWITCH=12,
  2259. C    5     TOOBIG=2, W=59, XMSAVE=49)
  2260. C/
  2261. C
  2262. C+++++++++++++++++++++++++++++++  BODY  ++++++++++++++++++++++++++++++++
  2263. C
  2264.       COVIRC = 4
  2265.       KIND = IV(COVREQ)
  2266.       M = IV(MODE)
  2267.       IF (M .GT. 0) GO TO 10
  2268.          IV(KAGQT) = -1
  2269.          IF (IV(KALM) .GT. 0) IV(KALM) = 0
  2270.          IF (IABS(KIND) .GE. 3) GO TO 300
  2271.          V(FX) = V(F)
  2272.          K = IV(RSAVE)
  2273.          CALL VCOPY(N, V(K), R)
  2274.  10   IF (M .GT. P) GO TO 200
  2275.       IF (KIND .LT. 0) GO TO 100
  2276. C
  2277. C  ***  COMPUTE FINITE-DIFFERENCE HESSIAN USING BOTH FUNCTION AND
  2278. C  ***  GRADIENT VALUES.
  2279. C
  2280.       GSAVE1 = IV(W) + P
  2281.       G1 = IV(G)
  2282.       IF (M .GT. 0) GO TO 15
  2283. C        ***  FIRST CALL ON COVCLC.  SET GSAVE = G, TAKE FIRST STEP  ***
  2284.          CALL VCOPY(P, V(GSAVE1), V(G1))
  2285.          IV(SWITCH) = IV(NFGCAL)
  2286.          GO TO 80
  2287. C
  2288.  15   DEL = V(DELTA)
  2289.       X(M) = V(XMSAVE)
  2290.       IF (IV(TOOBIG) .EQ. 0) GO TO 30
  2291. C
  2292. C     ***  HANDLE OVERSIZE V(DELTA)  ***
  2293. C
  2294.          IF (DEL*X(M) .GT. ZERO) GO TO 20
  2295. C             ***  WE ALREADY TRIED SHRINKING V(DELTA), SO QUIT  ***
  2296.               IV(COVMAT) = -2
  2297.               GO TO 190
  2298. C
  2299. C        ***  TRY SHRINKING V(DELTA)  ***
  2300.  20      DEL = NEGPT5 * DEL
  2301.          GO TO 90
  2302. C
  2303.  30   COV = IV(LMAT)
  2304.       GP = G1 + P - 1
  2305. C
  2306. C  ***  SET  G = (G - GSAVE)/DEL  ***
  2307. C
  2308.       DO 40 I = G1, GP
  2309.          V(I) = (V(I) - V(GSAVE1)) / DEL
  2310.          GSAVE1 = GSAVE1 + 1
  2311.  40      CONTINUE
  2312. C
  2313. C  ***  ADD G AS NEW COL. TO FINITE-DIFF. HESSIAN MATRIX  ***
  2314. C
  2315.       K = COV + M*(M-1)/2
  2316.       L = K + M - 2
  2317.       IF ( M .EQ. 1) GO TO 60
  2318. C
  2319. C  ***  SET  H(I,M) = 0.5 * (H(I,M) + G(I))  FOR I = 1 TO M-1  ***
  2320. C
  2321.       DO 50 I = K, L
  2322.          V(I) = HALF * (V(I) + V(G1))
  2323.          G1 = G1 + 1
  2324.  50      CONTINUE
  2325. C
  2326. C  ***  ADD  H(I,M) = G(I)  FOR I = M TO P  ***
  2327. C
  2328.  60   L = L + 1
  2329.       DO 70 I = M, P
  2330.          V(L) = V(G1)
  2331.          L = L + I
  2332.          G1 = G1 + 1
  2333.  70      CONTINUE
  2334. C
  2335.  80   M = M + 1
  2336.       IV(MODE) = M
  2337.       IF (M .GT. P) GO TO 190
  2338. C
  2339. C  ***  CHOOSE NEXT FINITE-DIFFERENCE STEP, RETURN TO GET G THERE  ***
  2340. C
  2341.       DEL = V(DELTA0) * AMAX1(ONE/D(M), ABS(X(M)))
  2342.       IF (X(M) .LT. ZERO) DEL = -DEL
  2343.       V(XMSAVE) = X(M)
  2344.  90   X(M) = X(M) + DEL
  2345.       V(DELTA) = DEL
  2346.       COVIRC = 2
  2347.       GO TO 999
  2348. C
  2349. C  ***  COMPUTE FINITE-DIFFERENCE HESSIAN USING FUNCTION VALUES ONLY.
  2350. C
  2351.  100  STP0 = IV(W) + P - 1
  2352.       MM1 = M - 1
  2353.       MM1O2 = M*MM1/2
  2354.       IF (M .GT. 0) GO TO 105
  2355. C        ***  FIRST CALL ON COVCLC.  ***
  2356.          IV(SAVEI) = 0
  2357.          GO TO 180
  2358. C
  2359.  105  I = IV(SAVEI)
  2360.       IF (I .GT. 0) GO TO 160
  2361.       IF (IV(TOOBIG) .EQ. 0) GO TO 120
  2362. C
  2363. C     ***  HANDLE OVERSIZE STEP  ***
  2364. C
  2365.          STPM = STP0 + M
  2366.          DEL = V(STPM)
  2367.          IF (DEL*X(XMSAVE) .GT. ZERO) GO TO 110
  2368. C             ***  WE ALREADY TRIED SHRINKING THE STEP, SO QUIT  ***
  2369.               IV(COVMAT) = -2
  2370.               GO TO 999
  2371. C
  2372. C        ***  TRY SHRINKING THE STEP  ***
  2373.  110     DEL = NEGPT5 * DEL
  2374.          X(M) = X(XMSAVE) + DEL
  2375.          V(STPM) = DEL
  2376.          COVIRC = 1
  2377.          GO TO 999
  2378. C
  2379. C  ***  SAVE F(X + STP(M)*E(M)) IN H(P,M)  ***
  2380. C
  2381.  120  PP1O2 = P * (P-1) / 2
  2382.       COV = IV(LMAT)
  2383.       HPM = COV + PP1O2 + MM1
  2384.       V(HPM) = V(F)
  2385. C
  2386. C  ***  START COMPUTING ROW M OF THE FINITE-DIFFERENCE HESSIAN H.  ***
  2387. C
  2388.       HMI = COV + MM1O2
  2389.       IF (MM1 .EQ. 0) GO TO 140
  2390.       HPI = COV + PP1O2
  2391.       DO 130 I = 1, MM1
  2392.          V(HMI) = V(FX) - (V(F) + V(HPI))
  2393.          HMI = HMI + 1
  2394.          HPI = HPI + 1
  2395.  130     CONTINUE
  2396.  140  V(HMI) = V(F) - TWO*V(FX)
  2397. C
  2398. C  ***  COMPUTE FUNCTION VALUES NEEDED TO COMPLETE ROW M OF H.  ***
  2399. C
  2400.       I = 1
  2401. C
  2402.  150  IV(SAVEI) = I
  2403.       STPI = STP0 + I
  2404.       V(DELTA) = X(I)
  2405.       X(I) = X(I) + V(STPI)
  2406.       IF (I .EQ. M) X(I) = V(XMSAVE) - V(STPI)
  2407.       COVIRC = 1
  2408.       GO TO 999
  2409. C
  2410.  160  X(I) = V(DELTA)
  2411.       IF (IV(TOOBIG) .EQ. 0) GO TO 170
  2412. C        ***  PUNT IN THE EVENT OF AN OVERSIZE STEP  ***
  2413.          IV(COVMAT) = -2
  2414.          GO TO 999
  2415. C
  2416. C  ***  FINISH COMPUTING H(M,I)  ***
  2417. C
  2418.  170  STPI = STP0 + I
  2419.       HMI = COV + MM1O2 + I - 1
  2420.       STPM = STP0 + M
  2421.       V(HMI) = (V(HMI) + V(F)) / (V(STPI)*V(STPM))
  2422.       I = I + 1
  2423.       IF (I .LE. M) GO TO 150
  2424.       IV(SAVEI) = 0
  2425.       X(M) = V(XMSAVE)
  2426. C
  2427.  180  M = M + 1
  2428.       IV(MODE) = M
  2429.       IF (M .GT. P) GO TO 190
  2430. C
  2431. C  ***  PREPARE TO COMPUTE ROW M OF THE FINITE-DIFFERENCE HESSIAN H.
  2432. C  ***  COMPUTE M-TH STEP SIZE STP(M), THEN RETURN TO OBTAIN
  2433. C  ***  F(X + STP(M)*E(M)), WHERE E(M) = M-TH STD. UNIT VECTOR.
  2434. C
  2435.       DEL = V(DLTFDC) * AMAX1(ONE/D(M), ABS(X(M)))
  2436.       IF (X(M) .LT. ZERO) DEL = -DEL
  2437.       V(XMSAVE) = X(M)
  2438.       X(M) = X(M) + DEL
  2439.       STPM = STP0 + M
  2440.       V(STPM) = DEL
  2441.       COVIRC = 1
  2442.       GO TO 999
  2443. C
  2444. C  ***  RESTORE R, V(F), ETC.  ***
  2445. C
  2446.  190  K = IV(RSAVE)
  2447.       CALL VCOPY(N, R, V(K))
  2448.       V(F) = V(FX)
  2449.       IF (KIND .LT. 0) GO TO 200
  2450.          IV(NFGCAL) = IV(SWITCH)
  2451.          QTR1 = IV(QTR)
  2452.          CALL VCOPY(N, V(QTR1), R)
  2453.          IF (IV(COVMAT) .LT. 0) GO TO 999
  2454.          COVIRC = 3
  2455.          GO TO 999
  2456. C
  2457.  200  COV = IV(LMAT)
  2458. C
  2459. C  ***  THE COMPLETE FINITE-DIFF. HESSIAN IS NOW STORED AT V(COV).   ***
  2460. C  ***  USE IT TO COMPUTE THE REQUESTED COVARIANCE MATRIX.           ***
  2461. C
  2462. C     ***  COMPUTE CHOLESKY FACTOR C OF H = C*(C**T)  ***
  2463. C     ***  AND STORE IT AT V(HC).  ***
  2464. C
  2465.       HC = COV
  2466.       IF (IABS(KIND) .EQ. 2) GO TO 210
  2467.          HC = IABS(IV(H))
  2468.          IV(H) = -HC
  2469.  210  CALL LSQRT(1, P, V(HC), V(COV), IRC)
  2470.       IV(COVMAT) = -1
  2471.       IF (IRC .NE. 0) GO TO 999
  2472. C
  2473.       W1 = IV(W) + P
  2474.       IF (IABS(KIND) .GT. 1) GO TO 350
  2475. C
  2476. C  ***  COVARIANCE = SCALE * H**-1 * (J**T * J) * H**-1  ***
  2477. C
  2478.       CALL VSCOPY(P*(P+1)/2, V(COV), ZERO)
  2479.       HAVEJ = IV(KALM) .EQ. (-1)
  2480. C     ***  HAVEJ = .TRUE. MEANS J IS IN ITS ORIGINAL FORM, WHILE
  2481. C     ***  HAVEJ = .FALSE. MEANS QRFACT HAS BEEN APPLIED TO J.
  2482. C
  2483.       M = P
  2484.       IF (HAVEJ) M = N
  2485.       W0 = W1 - 1
  2486.       RD1 = IV(RD)
  2487.       DO 290 I = 1, M
  2488.          IF (HAVEJ) GO TO 240
  2489. C
  2490. C        ***  SET W = IPIVOT * (ROW I OF R MATRIX FROM QRFACT).  ***
  2491. C
  2492.               CALL VSCOPY(P, V(W1), ZERO)
  2493.               IPIVI = IPIV0 + I
  2494.               L = W0 + IV(IPIVI)
  2495.               V(L) = V(RD1)
  2496.               RD1 = RD1 + 1
  2497.               IF (I .EQ. P) GO TO 260
  2498.               IP1 = I + 1
  2499.               DO 230 K = IP1, P
  2500.                    IPIVK = IPIV0 + K
  2501.                    L = W0 + IV(IPIVK)
  2502.                    V(L) = J(I,K)
  2503.  230               CONTINUE
  2504.               GO TO 260
  2505. C
  2506. C        ***  SET W = (ROW I OF J).  ***
  2507. C
  2508.  240     L = W0
  2509.          DO 250 K = 1, P
  2510.               L = L + 1
  2511.               V(L) = J(I,K)
  2512.  250          CONTINUE
  2513. C
  2514. C        ***  SET W = H**-1 * W.  ***
  2515. C
  2516.  260     CALL LIVMUL(P, V(W1), V(HC), V(W1))
  2517.          CALL LITVMU(P, V(W1), V(HC), V(W1))
  2518. C
  2519. C        ***  ADD  W * W**T  TO COVARIANCE MATRIX.  ***
  2520. C
  2521.          KL = COV
  2522.          DO 280 K = 1, P
  2523.               L = W0 + K
  2524.               WK = V(L)
  2525.               DO 270 L = 1, K
  2526.                    WL = W0 + L
  2527.                    V(KL) = V(KL)  +  WK * V(WL)
  2528.                    KL = KL + 1
  2529.  270               CONTINUE
  2530.  280          CONTINUE
  2531.  290     CONTINUE
  2532.       GO TO 380
  2533. C
  2534. C  ***  COVARIANCE = SCALE * (J**T * J)**-1.  ***
  2535. C
  2536.  300  RD1 = IV(RD)
  2537.       IF (IV(KALM) .NE. (-1)) GO TO 310
  2538. C
  2539. C        ***  APPLY QRFACT TO J  ***
  2540. C
  2541.          QTR1 = IV(QTR)
  2542.          CALL VCOPY(N, V(QTR1), R)
  2543.          W1 = IV(W) + P
  2544.          CALL QRFACT(NN, N, P, J, V(RD1), IV(IPIVOT), IV(IERR), 0,
  2545.      1               V(W1))
  2546.          IV(KALM) = -2
  2547.  310  IV(COVMAT) = -1
  2548.       IF (IV(IERR) .NE. 0) GO TO 999
  2549.       COV = IV(LMAT)
  2550.       HC = IABS(IV(H))
  2551.       IV(H) = -HC
  2552. C
  2553. C     ***  SET HC = (R MATRIX FROM QRFACT).  ***
  2554. C
  2555.       L = HC
  2556.       DO 340 I = 1, P
  2557.          IF (I .GT. 1) CALL VCOPY(I-1, V(L), J(1,I))
  2558.          L = L + I - 1
  2559.          V(L) = V(RD1)
  2560.          L = L + 1
  2561.          RD1 = RD1 + 1
  2562.  340     CONTINUE
  2563. C
  2564. C  ***  THE CHOLESKY FACTOR C OF THE UNSCALED INVERSE COVARIANCE MATRIX
  2565. C  ***  (OR PERMUTATION THEREOF) IS STORED AT V(HC).
  2566. C
  2567. C  ***  SET C = C**-1.
  2568. C
  2569.  350  CALL LINVRT(P, V(HC), V(HC))
  2570. C
  2571. C  ***  SET C = C**T * C.
  2572. C
  2573.       CALL LTSQAR(P, V(HC), V(HC))
  2574. C
  2575.       IF (HC .EQ. COV) GO TO 380
  2576. C
  2577. C     ***  C = PERMUTED, UNSCALED COVARIANCE.
  2578. C     ***  SET COV = IPIVOT * C * IPIVOT**T.
  2579. C
  2580.          DO 370 I = 1, P
  2581.               M = IPIV0 + I
  2582.               IPIVI = IV(M)
  2583.               KL = COV-1 + IPIVI*(IPIVI-1)/2
  2584.               DO 360 K = 1, I
  2585.                    M = IPIV0 + K
  2586.                    IPIVK = IV(M)
  2587.                    L = KL + IPIVK
  2588.                    IF (IPIVK .GT. IPIVI)
  2589.      1                       L = L + (IPIVK-IPIVI)*(IPIVK+IPIVI-3)/2
  2590.                    V(L) = V(HC)
  2591.                    HC = HC + 1
  2592.  360               CONTINUE
  2593.  370          CONTINUE
  2594. C
  2595.  380  IV(COVMAT) = COV
  2596. C
  2597. C  ***  APPLY SCALE FACTOR = (RESID. SUM OF SQUARES) / MAX(1,N-P).
  2598. C
  2599.       T = V(F) / (HALF * FLOAT(MAX0(1,N-P)))
  2600.       K = COV - 1 + P*(P+1)/2
  2601.       DO 390 I = COV, K
  2602.  390     V(I) = T * V(I)
  2603. C
  2604.  999  RETURN
  2605. C  ***  LAST CARD OF COVCLC FOLLOWS  ***
  2606.       END
  2607.       SUBROUTINE DFAULT(IV, V)                                          DFA00010
  2608. C
  2609. C  ***  SUPPLY NL2SOL (VERSION 2.2) DEFAULT VALUES TO IV AND V  ***
  2610. C
  2611.       INTEGER IV(25)
  2612.       REAL V(45)
  2613. C/+
  2614.       REAL AMAX1
  2615. C/
  2616.       EXTERNAL IMDCON, RMDCON
  2617.       INTEGER IMDCON
  2618.       REAL RMDCON
  2619. C
  2620.       REAL MACHEP, MEPCRT, ONE, SQTEPS, THREE
  2621. C
  2622. C  ***  SUBSCRIPTS FOR IV AND V  ***
  2623. C
  2624.       INTEGER AFCTOL, COSMIN, COVPRT, COVREQ, DECFAC, DELTA0, DFAC,
  2625.      1        DINIT, DLTFDC, DLTFDJ, DTYPE, D0INIT, EPSLON, FUZZ,
  2626.      2        INCFAC, INITS, JTINIT, LMAX0, MXFCAL, MXITER, OUTLEV,
  2627.      3        PARPRT, PHMNFC, PHMXFC, PRUNIT, RDFCMN, RDFCMX,
  2628.      4        RFCTOL, RLIMIT, SOLPRT, STATPR, TUNER1, TUNER2, TUNER3,
  2629.      5        TUNER4, TUNER5, XCTOL, XFTOL, X0PRT
  2630. C
  2631. C/6
  2632.       DATA ONE/1.E+0/, THREE/3.E+0/
  2633. C/7
  2634. C     PARAMETER (ONE=1.D+0, THREE=3.D+0)
  2635. C/
  2636. C
  2637. C  ***  IV SUBSCRIPT VALUES  ***
  2638. C
  2639. C/6
  2640.       DATA COVPRT/14/, COVREQ/15/, DTYPE/16/, INITS/25/,
  2641.      1     MXFCAL/17/, MXITER/18/, OUTLEV/19/,
  2642.      2     PARPRT/20/, PRUNIT/21/, SOLPRT/22/,
  2643.      3     STATPR/23/, X0PRT/24/
  2644. C/7
  2645. C     PARAMETER (COVPRT=14, COVREQ=15, DTYPE=16, INITS=25,
  2646. C    1     MXFCAL=17, MXITER=18, OUTLEV=19,
  2647. C    2     PARPRT=20, PRUNIT=21, SOLPRT=22,
  2648. C    3     STATPR=23, X0PRT=24)
  2649. C/
  2650. C
  2651. C  ***  V SUBSCRIPT VALUES  ***
  2652. C
  2653. C/6
  2654.       DATA AFCTOL/31/, COSMIN/43/, DECFAC/22/,
  2655.      1     DELTA0/44/, DFAC/41/, DINIT/38/, DLTFDC/40/,
  2656.      2     DLTFDJ/36/, D0INIT/37/, EPSLON/19/, FUZZ/45/,
  2657.      3     INCFAC/23/, JTINIT/39/, LMAX0/35/, PHMNFC/20/,
  2658.      4     PHMXFC/21/, RDFCMN/24/, RDFCMX/25/,
  2659.      5     RFCTOL/32/, RLIMIT/42/, TUNER1/26/,
  2660.      6     TUNER2/27/, TUNER3/28/, TUNER4/29/,
  2661.      7     TUNER5/30/, XCTOL/33/, XFTOL/34/
  2662. C/7
  2663. C     PARAMETER (AFCTOL=31, COSMIN=43, DECFAC=22,
  2664. C    1     DELTA0=44, DFAC=41, DINIT=38, DLTFDC=40,
  2665. C    2     DLTFDJ=36, D0INIT=37, EPSLON=19, FUZZ=45,
  2666. C    3     INCFAC=23, JTINIT=39, LMAX0=35, PHMNFC=20,
  2667. C    4     PHMXFC=21, RDFCMN=24, RDFCMX=25,
  2668. C    5     RFCTOL=32, RLIMIT=42, TUNER1=26,
  2669. C    6     TUNER2=27, TUNER3=28, TUNER4=29,
  2670. C    7     TUNER5=30, XCTOL=33, XFTOL=34)
  2671. C/
  2672. C
  2673. C-----------------------------------------------------------------------
  2674. C
  2675.       IV(1) = 12
  2676.       IV(COVPRT) = 1
  2677.       IV(COVREQ) = 1
  2678.       IV(DTYPE) = 1
  2679.       IV(INITS) = 0
  2680.       IV(MXFCAL) = 200
  2681.       IV(MXITER) = 150
  2682.       IV(OUTLEV) = 1
  2683.       IV(PARPRT) = 1
  2684.       IV(PRUNIT) = IMDCON(1)
  2685.       IV(SOLPRT) = 1
  2686.       IV(STATPR) = 1
  2687.       IV(X0PRT) = 1
  2688. C
  2689.       MACHEP = RMDCON(3)
  2690.       V(AFCTOL) = 1.E-20
  2691.       IF (MACHEP .GT. 1.E-10) V(AFCTOL) = MACHEP**2
  2692.       V(COSMIN) = AMAX1(1.E-6, 1.E+2 * MACHEP)
  2693.       V(DECFAC) = 0.5E+0
  2694.       SQTEPS = RMDCON(4)
  2695.       V(DELTA0) = SQTEPS
  2696.       V(DFAC) = 0.6E+0
  2697.       V(DINIT) = 0.E+0
  2698.       MEPCRT = MACHEP ** (ONE/THREE)
  2699.       V(DLTFDC) = MEPCRT
  2700.       V(DLTFDJ) = SQTEPS
  2701.       V(D0INIT) = 1.E+0
  2702.       V(EPSLON) = 0.1E+0
  2703.       V(FUZZ) = 1.5E+0
  2704.       V(INCFAC) = 2.E+0
  2705.       V(JTINIT) = 1.E-6
  2706.       V(LMAX0) = 100.E+0
  2707.       V(PHMNFC) = -0.1E+0
  2708.       V(PHMXFC) = 0.1E+0
  2709.       V(RDFCMN) = 0.1E+0
  2710.       V(RDFCMX) = 4.E+0
  2711.       V(RFCTOL) = AMAX1(1.E-10, MEPCRT**2)
  2712.       V(RLIMIT) = RMDCON(5)
  2713.       V(TUNER1) = 0.1E+0
  2714.       V(TUNER2) = 1.E-4
  2715.       V(TUNER3) = 0.75E+0
  2716.       V(TUNER4) = 0.5E+0
  2717.       V(TUNER5) = 0.75E+0
  2718.       V(XCTOL) = SQTEPS
  2719.       V(XFTOL) = 1.E+2 * MACHEP
  2720. C
  2721.  999  RETURN
  2722. C  ***  LAST CARD OF DFAULT FOLLOWS  ***
  2723.       END
  2724.       REAL FUNCTION DOTPRD(P, X, Y)                                     DOT00010
  2725. C
  2726. C  ***  RETURN THE INNER PRODUCT OF THE P-VECTORS X AND Y.  ***
  2727. C
  2728.       INTEGER P
  2729.       REAL X(P), Y(P)
  2730. C
  2731.       INTEGER I
  2732.       REAL ONE, SQTETA, T, ZERO
  2733. C/+
  2734.       REAL AMAX1, ABS
  2735. C/
  2736.       EXTERNAL RMDCON
  2737.       REAL RMDCON
  2738. C
  2739. C  ***  RMDCON(2) RETURNS A MACHINE-DEPENDENT CONSTANT, SQTETA, WHICH
  2740. C  ***  IS SLIGHTLY LARGER THAN THE SMALLEST POSITIVE NUMBER THAT
  2741. C  ***  CAN BE SQUARED WITHOUT UNDERFLOWING.
  2742. C
  2743. C/6
  2744.       DATA ONE/1.E+0/, SQTETA/0.E+0/, ZERO/0.E+0/
  2745. C/7
  2746. C     PARAMETER (ONE=1.D+0, ZERO=0.D+0)
  2747. C     DATA SQTETA/0.D+0/
  2748. C/
  2749. C
  2750.       DOTPRD = ZERO
  2751.       IF (P .LE. 0) GO TO 999
  2752.       IF (SQTETA .EQ. ZERO) SQTETA = RMDCON(2)
  2753.       DO 20 I = 1, P
  2754.          T = AMAX1(ABS(X(I)), ABS(Y(I)))
  2755.          IF (T .GT. ONE) GO TO 10
  2756.          IF (T .LT. SQTETA) GO TO 20
  2757.          T = (X(I)/SQTETA)*Y(I)
  2758.          IF (ABS(T) .LT. SQTETA) GO TO 20
  2759.  10      DOTPRD = DOTPRD + X(I)*Y(I)
  2760.  20   CONTINUE
  2761. C
  2762.  999  RETURN
  2763. C  ***  LAST CARD OF DOTPRD FOLLOWS  ***
  2764.       END
  2765.       SUBROUTINE DUPDAT(D, IV, J, N, NN, P, V)                          DUP00010
  2766. C
  2767. C  ***  UPDATE SCALE VECTOR D FOR NL2ITR (NL2SOL VERSION 2.2)  ***
  2768. C
  2769. C  ***  PARAMETER DECLARATIONS  ***
  2770. C
  2771.       INTEGER IV(1), N, NN, P
  2772.       REAL D(P), J(NN,P), V(1)
  2773. C     DIMENSION IV(*), V(*)
  2774. C
  2775. C  ***  LOCAL VARIABLES  ***
  2776. C
  2777.       INTEGER D0, I, JTOLI, S1
  2778.       REAL SII, T, VDFAC
  2779. C
  2780. C     ***  CONSTANTS  ***
  2781.       REAL ZERO
  2782. C
  2783. C  ***  INTRINSIC FUNCTIONS  ***
  2784. C/+
  2785.       REAL AMAX1, SQRT
  2786. C/
  2787. C  ***  EXTERNAL FUNCTION  ***
  2788. C
  2789.       EXTERNAL V2NORM
  2790.       REAL V2NORM
  2791. C
  2792. C  ***  SUBSCRIPTS FOR IV AND V  ***
  2793. C
  2794.       INTEGER DFAC, DTYPE, JTOL0, NITER, S
  2795. C/6
  2796.       DATA DFAC/41/, DTYPE/16/, JTOL0/86/, NITER/31/, S/53/
  2797. C/7
  2798. C     PARAMETER (DFAC=41, DTYPE=16, JTOL0=86, NITER=31, S=53)
  2799. C/
  2800. C
  2801. C/6
  2802.       DATA ZERO/0.E+0/
  2803. C/7
  2804. C     PARAMETER (ZERO=0.D+0)
  2805. C/
  2806. C
  2807. C-----------------------------------------------------------------------
  2808. C
  2809.       I = IV(DTYPE)
  2810.       IF (I .EQ. 1) GO TO 20
  2811.          IF (IV(NITER) .GT. 0) GO TO 999
  2812. C
  2813.  20   VDFAC = V(DFAC)
  2814.       D0 = JTOL0 + P
  2815.       S1 = IV(S) - 1
  2816.       DO 30 I = 1, P
  2817.          S1 = S1 + I
  2818.          SII = V(S1)
  2819.          T = V2NORM(N, J(1,I))
  2820.          IF (SII .GT. ZERO) T = SQRT(T*T + SII)
  2821.          JTOLI = JTOL0 + I
  2822.          D0 = D0 + 1
  2823.          IF (T .LT. V(JTOLI)) T = AMAX1(V(D0), V(JTOLI))
  2824.          D(I) = AMAX1(VDFAC*D(I), T)
  2825.  30      CONTINUE
  2826. C
  2827.  999  RETURN
  2828. C  ***  LAST CARD OF DUPDAT FOLLOWS  ***
  2829.       END
  2830.       SUBROUTINE GQTSTP(D, DIG, DIHDI, KA, L, P, STEP, V, W)            GQT00010
  2831. C
  2832. C  *** COMPUTE GOLDFELD-QUANDT-TROTTER STEP BY MORE-HEBDEN TECHNIQUE ***
  2833. C  ***  (NL2SOL VERSION 2.2)  ***
  2834. C
  2835. C  ***  PARAMETER DECLARATIONS  ***
  2836. C
  2837.       INTEGER KA, P
  2838.       REAL D(P), DIG(P), DIHDI(1), L(1), V(21), STEP(P),
  2839.      1                 W(1)
  2840. C     DIMENSION DIHDI(P*(P+1)/2), L(P*(P+1)/2), W(4*P+7)
  2841. C
  2842. C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2843. C
  2844. C  ***  PURPOSE  ***
  2845. C
  2846. C        GIVEN THE (COMPACTLY STORED) LOWER TRIANGLE OF A SCALED
  2847. C     HESSIAN (APPROXIMATION) AND A NONZERO SCALED GRADIENT VECTOR,
  2848. C     THIS SUBROUTINE COMPUTES A GOLDFELD-QUANDT-TROTTER STEP OF
  2849. C     APPROXIMATE LENGTH V(RADIUS) BY THE MORE-HEBDEN TECHNIQUE.  IN
  2850. C     OTHER WORDS, STEP IS COMPUTED TO (APPROXIMATELY) MINIMIZE
  2851. C     PSI(STEP) = (G**T)*STEP + 0.5*(STEP**T)*H*STEP  SUCH THAT THE
  2852. C     2-NORM OF D*STEP IS AT MOST (APPROXIMATELY) V(RADIUS), WHERE
  2853. C     G  IS THE GRADIENT,  H  IS THE HESSIAN, AND  D  IS A DIAGONAL
  2854. C     SCALE MATRIX WHOSE DIAGONAL IS STORED IN THE PARAMETER D.
  2855. C     (GQTSTP ASSUMES  DIG = D**-1 * G  AND  DIHDI = D**-1 * H * D**-1.)
  2856. C     IF G = 0, HOWEVER, STEP = 0 IS RETURNED (EVEN AT A SADDLE POINT).
  2857. C
  2858. C  ***  PARAMETER DESCRIPTION  ***
  2859. C
  2860. C     D (IN)  = THE SCALE VECTOR, I.E. THE DIAGONAL OF THE SCALE
  2861. C              MATRIX  D  MENTIONED ABOVE UNDER PURPOSE.
  2862. C   DIG (IN)  = THE SCALED GRADIENT VECTOR, D**-1 * G.  IF G = 0, THEN
  2863. C              STEP = 0  AND  V(STPPAR) = 0  ARE RETURNED.
  2864. C DIHDI (IN)  = LOWER TRIANGLE OF THE SCALED HESSIAN (APPROXIMATION),
  2865. C              I.E., D**-1 * H * D**-1, STORED COMPACTLY BY ROWS., I.E.,
  2866. C              IN THE ORDER (1,1), (2,1), (2,2), (3,1), (3,2), ETC.
  2867. C    KA (I/O) = THE NUMBER OF HEBDEN ITERATIONS (SO FAR) TAKEN TO DETER-
  2868. C              MINE STEP.  KA .LT. 0 ON INPUT MEANS THIS IS THE FIRST
  2869. C              ATTEMPT TO DETERMINE STEP (FOR THE PRESENT DIG AND DIHDI)
  2870. C              -- KA IS INITIALIZED TO 0 IN THIS CASE.  OUTPUT WITH
  2871. C              KA = 0  (OR V(STPPAR) = 0)  MEANS  STEP = -(H**-1)*G.
  2872. C     L (I/O) = WORKSPACE OF LENGTH P*(P+1)/2 FOR CHOLESKY FACTORS.
  2873. C     P (IN)  = NUMBER OF PARAMETERS -- THE HESSIAN IS A  P X P  MATRIX.
  2874. C  STEP (I/O) = THE STEP COMPUTED.
  2875. C     V (I/O) CONTAINS VARIOUS CONSTANTS AND VARIABLES DESCRIBED BELOW.
  2876. C     W (I/O) = WORKSPACE OF LENGTH 4*P + 6.
  2877. C
  2878. C  ***  ENTRIES IN V  ***
  2879. C
  2880. C V(DGNORM) (I/O) = 2-NORM OF (D**-1)*G.
  2881. C V(DSTNRM) (OUTPUT) = 2-NORM OF D*STEP.
  2882. C V(DST0)   (I/O) = 2-NORM OF D*(H**-1)*G (FOR POS. DEF. H ONLY), OR
  2883. C             OVERESTIMATE OF SMALLEST EIGENVALUE OF (D**-1)*H*(D**-1).
  2884. C V(EPSLON) (IN)  = MAX. REL. ERROR ALLOWED FOR PSI(STEP).  FOR THE
  2885. C             STEP RETURNED, PSI(STEP) WILL EXCEED ITS OPTIMAL VALUE
  2886. C             BY LESS THAN -V(EPSLON)*PSI(STEP).  SUGGESTED VALUE = 0.1.
  2887. C V(GTSTEP) (OUT) = INNER PRODUCT BETWEEN G AND STEP.
  2888. C V(NREDUC) (OUT) = PSI(-(H**-1)*G) = PSI(NEWTON STEP)  (FOR POS. DEF.
  2889. C             H ONLY -- V(NREDUC) IS SET TO ZERO OTHERWISE).
  2890. C V(PHMNFC) (IN)  = TOL. (TOGETHER WITH V(PHMXFC)) FOR ACCEPTING STEP
  2891. C             (MORE*S SIGMA).  THE ERROR V(DSTNRM) - V(RADIUS) MUST LIE
  2892. C             BETWEEN V(PHMNFC)*V(RADIUS) AND V(PHMXFC)*V(RADIUS).
  2893. C V(PHMXFC) (IN)  (SEE V(PHMNFC).)
  2894. C             SUGGESTED VALUES -- V(PHMNFC) = -0.25, V(PHMXFC) = 0.5.
  2895. C V(PREDUC) (OUT) = PSI(STEP) = PREDICTED OBJ. FUNC. REDUCTION FOR STEP.
  2896. C V(RADIUS) (IN)  = RADIUS OF CURRENT (SCALED) TRUST REGION.
  2897. C V(RAD0)   (I/O) = VALUE OF V(RADIUS) FROM PREVIOUS CALL.
  2898. C V(STPPAR) (I/O) IS NORMALLY THE MARQUARDT PARAMETER, I.E. THE ALPHA
  2899. C             DESCRIBED BELOW UNDER ALGORITHM NOTES.  IF H + ALPHA*D**2
  2900. C             (SEE ALGORITHM NOTES) IS (NEARLY) SINGULAR, HOWEVER,
  2901. C             THEN V(STPPAR) = -ALPHA.
  2902. C
  2903. C  ***  USAGE NOTES  ***
  2904. C
  2905. C     IF IT IS DESIRED TO RECOMPUTE STEP USING A DIFFERENT VALUE OF
  2906. C     V(RADIUS), THEN THIS ROUTINE MAY BE RESTARTED BY CALLING IT
  2907. C     WITH ALL PARAMETERS UNCHANGED EXCEPT V(RADIUS).  (THIS EXPLAINS
  2908. C     WHY STEP AND W ARE LISTED AS I/O).  ON AN INTIIAL CALL (ONE WITH
  2909. C     KA .LT. 0), STEP AND W NEED NOT BE INITIALIZED AND ONLY COMPO-
  2910. C     NENTS V(EPSLON), V(STPPAR), V(PHMNFC), V(PHMXFC), V(RADIUS), AND
  2911. C     V(RAD0) OF V MUST BE INITIALIZED.  TO COMPUTE STEP FROM A SADDLE
  2912. C     POINT (WHERE THE TRUE GRADIENT VANISHES AND H HAS A NEGATIVE
  2913. C     EIGENVALUE), A NONZERO G WITH SMALL COMPONENTS SHOULD BE PASSED.
  2914. C
  2915. C  ***  APPLICATION AND USAGE RESTRICTIONS  ***
  2916. C
  2917. C     THIS ROUTINE IS CALLED AS PART OF THE NL2SOL (NONLINEAR LEAST-
  2918. C     SQUARES) PACKAGE (REF. 1), BUT IT COULD BE USED IN SOLVING ANY
  2919. C     UNCONSTRAINED MINIMIZATION PROBLEM.
  2920. C
  2921. C  ***  ALGORITHM NOTES  ***
  2922. C
  2923. C        THE DESIRED G-Q-T STEP (REF. 2, 3, 4) SATISFIES
  2924. C     (H + ALPHA*D**2)*STEP = -G  FOR SOME NONNEGATIVE ALPHA SUCH THAT
  2925. C     H + ALPHA*D**2 IS POSITIVE SEMIDEFINITE.  ALPHA AND STEP ARE
  2926. C     COMPUTED BY A SCHEME ANALOGOUS TO THE ONE DESCRIBED IN REF. 5.
  2927. C     ESTIMATES OF THE SMALLEST AND LARGEST EIGENVALUES OF THE HESSIAN
  2928. C     ARE OBTAINED FROM THE GERSCHGORIN CIRCLE THEOREM ENHANCED BY A
  2929. C     SIMPLE FORM OF THE SCALING DESCRIBED IN REF. 6.  CASES IN WHICH
  2930. C     H + ALPHA*D**2 IS NEARLY (OR EXACTLY) SINGULAR ARE HANDLED BY
  2931. C     THE TECHNIQUE DISCUSSED IN REF. 2.  IN THESE CASES, A STEP OF
  2932. C     (EXACT) LENGTH V(RADIUS) IS RETURNED FOR WHICH PSI(STEP) EXCEEDS
  2933. C     ITS OPTIMAL VALUE BY LESS THAN -V(EPSLON)*PSI(STEP).
  2934. C
  2935. C  ***  FUNCTIONS AND SUBROUTINES CALLED  ***
  2936. C
  2937. C DOTPRD - RETURNS INNER PRODUCT OF TWO VECTORS.
  2938. C LITVMU - APPLIES INVERSE-TRANSPOSE OF COMPACT LOWER TRIANG. MATRIX.
  2939. C LIVMUL - APPLIES INVERSE OF COMPACT LOWER TRIANG. MATRIX.
  2940. C LSQRT  - FINDS CHOLESKY FACTOR (OF COMPACTLY STORED LOWER TRIANG.).
  2941. C LSVMIN - RETURNS APPROX. TO MIN. SING. VALUE OF LOWER TRIANG. MATRIX.
  2942. C RMDCON - RETURNS MACHINE-DEPENDENT CONSTANTS.
  2943. C V2NORM - RETURNS 2-NORM OF A VECTOR.
  2944. C
  2945. C  ***  REFERENCES  ***
  2946. C
  2947. C 1.  DENNIS, J.E., GAY, D.M., AND WELSCH, R.E. (1981), AN ADAPTIVE
  2948. C             NONLINEAR LEAST-SQUARES ALGORITHM, ACM TRANS. MATH.
  2949. C             SOFTWARE, VOL. 7, NO. 3.
  2950. C 2.  GAY, D.M. (1981), COMPUTING OPTIMAL LOCALLY CONSTRAINED STEPS,
  2951. C             SIAM J. SCI. STATIST. COMPUTING, VOL. 2, NO. 2, PP.
  2952. C             186-197.
  2953. C 3.  GOLDFELD, S.M., QUANDT, R.E., AND TROTTER, H.F. (1966),
  2954. C             MAXIMIZATION BY QUADRATIC HILL-CLIMBING, ECONOMETRICA 34,
  2955. C             PP. 541-551.
  2956. C 4.  HEBDEN, M.D. (1973), AN ALGORITHM FOR MINIMIZATION USING EXACT
  2957. C             SECOND DERIVATIVES, REPORT T.P. 515, THEORETICAL PHYSICS
  2958. C             DIV., A.E.R.E. HARWELL, OXON., ENGLAND.
  2959. C 5.  MORE, J.J. (1978), THE LEVENBERG-MARQUARDT ALGORITHM, IMPLEMEN-
  2960. C             TATION AND THEORY, PP.105-116 OF SPRINGER LECTURE NOTES
  2961. C             IN MATHEMATICS NO. 630, EDITED BY G.A. WATSON, SPRINGER-
  2962. C             VERLAG, BERLIN AND NEW YORK.
  2963. C 6.  VARGA, R.S. (1965), MINIMAL GERSCHGORIN SETS, PACIFIC J. MATH. 15,
  2964. C             PP. 719-729.
  2965. C
  2966. C  ***  GENERAL  ***
  2967. C
  2968. C     CODED BY DAVID M. GAY.
  2969. C     THIS SUBROUTINE WAS WRITTEN IN CONNECTION WITH RESEARCH
  2970. C     SUPPORTED BY THE NATIONAL SCIENCE FOUNDATION UNDER GRANTS
  2971. C     MCS-7600324, DCR75-10143, 76-14311DSS, MCS76-11989, AND
  2972. C     MCS-7906671.
  2973. C
  2974. C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2975. C
  2976. C  ***  LOCAL VARIABLES  ***
  2977. C
  2978.       LOGICAL RESTRT
  2979.       INTEGER DGGDMX, DIAG, DIAG0, DSTSAV, EMAX, EMIN, I, IM1, INC, IRC,
  2980.      1        J, K, KALIM, K1, LK0, PHIPIN, Q, Q0, UK0, X, X0
  2981.       REAL ALPHAK, AKI, AKK, DELTA, DST, EPSO6, LK,
  2982.      1                 OLDPHI, PHI, PHIMAX, PHIMIN, PSIFAC, RAD,
  2983.      2                 ROOT, SI, SK, SW, T, TWOPSI, T1, UK, WI
  2984. C
  2985. C     ***  CONSTANTS  ***
  2986.       REAL DGXFAC, EPSFAC, FOUR, HALF, KAPPA, NEGONE, ONE,
  2987.      1                 P001, SIX, THREE, TWO, ZERO
  2988. C
  2989. C  ***  INTRINSIC FUNCTIONS  ***
  2990. C/+
  2991.       REAL ABS, AMAX1, AMIN1, SQRT
  2992. C/
  2993. C  ***  EXTERNAL FUNCTIONS AND SUBROUTINES  ***
  2994. C
  2995.       EXTERNAL DOTPRD, LITVMU, LIVMUL, LSQRT, LSVMIN, RMDCON, V2NORM
  2996.       REAL DOTPRD, LSVMIN, RMDCON, V2NORM
  2997. C
  2998. C  ***  SUBSCRIPTS FOR V  ***
  2999. C
  3000.       INTEGER DGNORM, DSTNRM, DST0, EPSLON, GTSTEP, STPPAR, NREDUC,
  3001.      1        PHMNFC, PHMXFC, PREDUC, RADIUS, RAD0
  3002. C/6
  3003.       DATA DGNORM/1/, DSTNRM/2/, DST0/3/, EPSLON/19/,
  3004.      1     GTSTEP/4/, NREDUC/6/, PHMNFC/20/,
  3005.      2     PHMXFC/21/, PREDUC/7/, RADIUS/8/,
  3006.      3     RAD0/9/, STPPAR/5/
  3007. C/7
  3008. C     PARAMETER (DGNORM=1, DSTNRM=2, DST0=3, EPSLON=19,
  3009. C    1     GTSTEP=4, NREDUC=6, PHMNFC=20,
  3010. C    2     PHMXFC=21, PREDUC=7, RADIUS=8,
  3011. C    3     RAD0=9, STPPAR=5)
  3012. C/
  3013. C
  3014. C/6
  3015.       DATA EPSFAC/50.0E+0/, FOUR/4.0E+0/, HALF/0.5E+0/,
  3016.      1     KAPPA/2.0E+0/, NEGONE/-1.0E+0/, ONE/1.0E+0/, P001/1.0E-3/,
  3017.      2     SIX/6.0E+0/, THREE/3.0E+0/, TWO/2.0E+0/, ZERO/0.0E+0/
  3018. C/7
  3019. C     PARAMETER (EPSFAC=50.0D+0, FOUR=4.0D+0, HALF=0.5D+0,
  3020. C    1     KAPPA=2.0D+0, NEGONE=-1.0D+0, ONE=1.0D+0, P001=1.0D-3,
  3021. C    2     SIX=6.0D+0, THREE=3.0D+0, TWO=2.0D+0, ZERO=0.0D+0)
  3022. C     SAVE DGXFAC
  3023. C/
  3024.       DATA DGXFAC/0.E+0/
  3025. C
  3026. C  ***  BODY  ***
  3027. C
  3028. C     ***  STORE LARGEST ABS. ENTRY IN (D**-1)*H*(D**-1) AT W(DGGDMX).
  3029.       DGGDMX = P + 1
  3030. C     ***  STORE GERSCHGORIN OVER- AND UNDERESTIMATES OF THE LARGEST
  3031. C     ***  AND SMALLEST EIGENVALUES OF (D**-1)*H*(D**-1) AT W(EMAX)
  3032. C     ***  AND W(EMIN) RESPECTIVELY.
  3033.       EMAX = DGGDMX + 1
  3034.       EMIN = EMAX + 1
  3035. C     ***  FOR USE IN RECOMPUTING STEP, THE FINAL VALUES OF LK, UK, DST,
  3036. C     ***  AND THE INVERSE DERIVATIVE OF MORE*S PHI AT 0 (FOR POS. DEF.
  3037. C     ***  H) ARE STORED IN W(LK0), W(UK0), W(DSTSAV), AND W(PHIPIN)
  3038. C     ***  RESPECTIVELY.
  3039.       LK0 = EMIN + 1
  3040.       PHIPIN = LK0 + 1
  3041.       UK0 = PHIPIN + 1
  3042.       DSTSAV = UK0 + 1
  3043. C     ***  STORE DIAG OF (D**-1)*H*(D**-1) IN W(DIAG),...,W(DIAG0+P).
  3044.       DIAG0 = DSTSAV
  3045.       DIAG = DIAG0 + 1
  3046. C     ***  STORE -D*STEP IN W(Q),...,W(Q0+P).
  3047.       Q0 = DIAG0 + P
  3048.       Q = Q0 + 1
  3049.       RAD = V(RADIUS)
  3050. C     ***  PHITOL = MAX. ERROR ALLOWED IN DST = V(DSTNRM) = 2-NORM OF
  3051. C     ***  D*STEP.
  3052.       PHIMAX = V(PHMXFC) * RAD
  3053.       PHIMIN = V(PHMNFC) * RAD
  3054. C     ***  EPSO6 AND PSIFAC ARE USED IN CHECKING FOR THE SPECIAL CASE
  3055. C     ***  OF (NEARLY) SINGULAR H + ALPHA*D**2 (SEE REF. 2).
  3056.       PSIFAC = TWO * V(EPSLON) / (THREE * (FOUR * (V(PHMNFC) + ONE) *
  3057.      1                       (KAPPA + ONE)  +  KAPPA  +  TWO) * RAD**2)
  3058. C     ***  OLDPHI IS USED TO DETECT LIMITS OF NUMERICAL ACCURACY.  IF
  3059. C     ***  WE RECOMPUTE STEP AND IT DOES NOT CHANGE, THEN WE ACCEPT IT.
  3060.       OLDPHI = ZERO
  3061.       EPSO6 = V(EPSLON)/SIX
  3062.       IRC = 0
  3063.       RESTRT = .FALSE.
  3064.       KALIM = KA + 50
  3065. C
  3066. C  ***  START OR RESTART, DEPENDING ON KA  ***
  3067. C
  3068.       IF (KA .GE. 0) GO TO 310
  3069. C
  3070. C  ***  FRESH START  ***
  3071. C
  3072.       K = 0
  3073.       UK = NEGONE
  3074.       KA = 0
  3075.       KALIM = 50
  3076. C
  3077. C     ***  STORE DIAG(DIHDI) IN W(DIAG0+1),...,W(DIAG0+P)  ***
  3078. C
  3079.       J = 0
  3080.       DO 20 I = 1, P
  3081.          J = J + I
  3082.          K1 = DIAG0 + I
  3083.          W(K1) = DIHDI(J)
  3084.  20      CONTINUE
  3085. C
  3086. C     ***  DETERMINE W(DGGDMX), THE LARGEST ELEMENT OF DIHDI  ***
  3087. C
  3088.       T1 = ZERO
  3089.       J = P * (P + 1) / 2
  3090.       DO 30 I = 1, J
  3091.          T = ABS(DIHDI(I))
  3092.          IF (T1 .LT. T) T1 = T
  3093.  30      CONTINUE
  3094.       W(DGGDMX) = T1
  3095. C
  3096. C  ***  TRY ALPHA = 0  ***
  3097. C
  3098.  40   CALL LSQRT(1, P, L, DIHDI, IRC)
  3099.       IF (IRC .EQ. 0) GO TO 60
  3100. C        ***  INDEF. H -- UNDERESTIMATE SMALLEST EIGENVALUE, USE THIS
  3101. C        ***  ESTIMATE TO INITIALIZE LOWER BOUND LK ON ALPHA.
  3102.          J = IRC*(IRC+1)/2
  3103.          T = L(J)
  3104.          L(J) = ONE
  3105.          DO 50 I = 1, IRC
  3106.  50           W(I) = ZERO
  3107.          W(IRC) = ONE
  3108.          CALL LITVMU(IRC, W, L, W)
  3109.          T1 = V2NORM(IRC, W)
  3110.          LK = -T / T1 / T1
  3111.          V(DST0) = -LK
  3112.          IF (RESTRT) GO TO 210
  3113.          V(NREDUC) = ZERO
  3114.          GO TO 70
  3115. C
  3116. C     ***  POSITIVE DEFINITE H -- COMPUTE UNMODIFIED NEWTON STEP.  ***
  3117.  60   LK = ZERO
  3118.       CALL LIVMUL(P, W(Q), L, DIG)
  3119.       V(NREDUC) = HALF * DOTPRD(P, W(Q), W(Q))
  3120.       CALL LITVMU(P, W(Q), L, W(Q))
  3121.       DST = V2NORM(P, W(Q))
  3122.       V(DST0) = DST
  3123.       PHI = DST - RAD
  3124.       IF (PHI .LE. PHIMAX) GO TO 280
  3125.       IF (RESTRT) GO TO 210
  3126. C
  3127. C  ***  PREPARE TO COMPUTE GERSCHGORIN ESTIMATES OF LARGEST (AND
  3128. C  ***  SMALLEST) EIGENVALUES.  ***
  3129. C
  3130.  70   V(DGNORM) = V2NORM(P, DIG)
  3131.       IF (V(DGNORM) .EQ. ZERO) GO TO 450
  3132.       K = 0
  3133.       DO 100 I = 1, P
  3134.          WI = ZERO
  3135.          IF (I .EQ. 1) GO TO 90
  3136.          IM1 = I - 1
  3137.          DO 80 J = 1, IM1
  3138.               K = K + 1
  3139.               T = ABS(DIHDI(K))
  3140.               WI = WI + T
  3141.               W(J) = W(J) + T
  3142.  80           CONTINUE
  3143.  90      W(I) = WI
  3144.          K = K + 1
  3145.  100     CONTINUE
  3146. C
  3147. C  ***  (UNDER-)ESTIMATE SMALLEST EIGENVALUE OF (D**-1)*H*(D**-1)  ***
  3148. C
  3149.       K = 1
  3150.       T1 = W(DIAG) - W(1)
  3151.       IF (P .LE. 1) GO TO 120
  3152.       DO 110 I = 2, P
  3153.          J = DIAG0 + I
  3154.          T = W(J) - W(I)
  3155.          IF (T .GE. T1) GO TO 110
  3156.               T1 = T
  3157.               K = I
  3158.  110     CONTINUE
  3159. C
  3160.  120  SK = W(K)
  3161.       J = DIAG0 + K
  3162.       AKK = W(J)
  3163.       K1 = K*(K-1)/2 + 1
  3164.       INC = 1
  3165.       T = ZERO
  3166.       DO 150 I = 1, P
  3167.          IF (I .EQ. K) GO TO 130
  3168.          AKI = ABS(DIHDI(K1))
  3169.          SI = W(I)
  3170.          J = DIAG0 + I
  3171.          T1 = HALF * (AKK - W(J) + SI - AKI)
  3172.          T1 = T1 + SQRT(T1*T1 + SK*AKI)
  3173.          IF (T .LT. T1) T = T1
  3174.          IF (I .LT. K) GO TO 140
  3175.  130     INC = I
  3176.  140     K1 = K1 + INC
  3177.  150     CONTINUE
  3178. C
  3179.       W(EMIN) = AKK - T
  3180.       UK = V(DGNORM)/RAD - W(EMIN)
  3181. C
  3182. C  ***  COMPUTE GERSCHGORIN (OVER-)ESTIMATE OF LARGEST EIGENVALUE  ***
  3183. C
  3184.       K = 1
  3185.       T1 = W(DIAG) + W(1)
  3186.       IF (P .LE. 1) GO TO 170
  3187.       DO 160 I = 2, P
  3188.          J = DIAG0 + I
  3189.          T = W(J) + W(I)
  3190.          IF (T .LE. T1) GO TO 160
  3191.               T1 = T
  3192.               K = I
  3193.  160     CONTINUE
  3194. C
  3195.  170  SK = W(K)
  3196.       J = DIAG0 + K
  3197.       AKK = W(J)
  3198.       K1 = K*(K-1)/2 + 1
  3199.       INC = 1
  3200.       T = ZERO
  3201.       DO 200 I = 1, P
  3202.          IF (I .EQ. K) GO TO 180
  3203.          AKI = ABS(DIHDI(K1))
  3204.          SI = W(I)
  3205.          J = DIAG0 + I
  3206.          T1 = HALF * (W(J) + SI - AKI - AKK)
  3207.          T1 = T1 + SQRT(T1*T1 + SK*AKI)
  3208.          IF (T .LT. T1) T = T1
  3209.          IF (I .LT. K) GO TO 190
  3210.  180     INC = I
  3211.  190     K1 = K1 + INC
  3212.  200     CONTINUE
  3213. C
  3214.       W(EMAX) = AKK + T
  3215.       LK = AMAX1(LK, V(DGNORM)/RAD - W(EMAX))
  3216. C
  3217. C     ***  ALPHAK = CURRENT VALUE OF ALPHA (SEE ALG. NOTES ABOVE).  WE
  3218. C     ***  USE MORE*S SCHEME FOR INITIALIZING IT.
  3219.       ALPHAK = ABS(V(STPPAR)) * V(RAD0)/RAD
  3220. C
  3221.       IF (IRC .NE. 0) GO TO 210
  3222. C
  3223. C  ***  COMPUTE L0 FOR POSITIVE DEFINITE H  ***
  3224. C
  3225.       CALL LIVMUL(P, W, L, W(Q))
  3226.       T = V2NORM(P, W)
  3227.       W(PHIPIN) = DST / T / T
  3228.       LK = AMAX1(LK, PHI*W(PHIPIN))
  3229. C
  3230. C  ***  SAFEGUARD ALPHAK AND ADD ALPHAK*I TO (D**-1)*H*(D**-1)  ***
  3231. C
  3232.  210  KA = KA + 1
  3233.       IF (-V(DST0) .GE. ALPHAK .OR. ALPHAK .LT. LK .OR. ALPHAK .GE. UK)
  3234.      1                      ALPHAK = UK * AMAX1(P001, SQRT(LK/UK))
  3235.       K = 0
  3236.       DO 220 I = 1, P
  3237.          K = K + I
  3238.          J = DIAG0 + I
  3239.          DIHDI(K) = W(J) + ALPHAK
  3240.  220     CONTINUE
  3241. C
  3242. C  ***  TRY COMPUTING CHOLESKY DECOMPOSITION  ***
  3243. C
  3244.       CALL LSQRT(1, P, L, DIHDI, IRC)
  3245.       IF (IRC .EQ. 0) GO TO 250
  3246. C
  3247. C  ***  (D**-1)*H*(D**-1) + ALPHAK*I  IS INDEFINITE -- OVERESTIMATE
  3248. C  ***  SMALLEST EIGENVALUE FOR USE IN UPDATING LK  ***
  3249. C
  3250.       J = (IRC*(IRC+1))/2
  3251.       T = L(J)
  3252.       L(J) = ONE
  3253.       DO 230 I = 1, IRC
  3254.  230     W(I) = ZERO
  3255.       W(IRC) = ONE
  3256.       CALL LITVMU(IRC, W, L, W)
  3257.       T1 = V2NORM(IRC, W)
  3258.       LK = ALPHAK - T/T1/T1
  3259.       V(DST0) = -LK
  3260.       GO TO 210
  3261. C
  3262. C  ***  ALPHAK MAKES (D**-1)*H*(D**-1) POSITIVE DEFINITE.
  3263. C  ***  COMPUTE Q = -D*STEP, CHECK FOR CONVERGENCE.  ***
  3264. C
  3265.  250  CALL LIVMUL(P, W(Q), L, DIG)
  3266.       CALL LITVMU(P, W(Q), L, W(Q))
  3267.       DST = V2NORM(P, W(Q))
  3268.       PHI = DST - RAD
  3269.       IF (PHI .LE. PHIMAX .AND. PHI .GE. PHIMIN) GO TO 290
  3270.       IF (PHI .EQ. OLDPHI) GO TO 290
  3271.       OLDPHI = PHI
  3272.       IF (PHI .GT. ZERO) GO TO 260
  3273. C        ***  CHECK FOR THE SPECIAL CASE OF  H + ALPHA*D**2  (NEARLY)
  3274. C        ***  SINGULAR.  DELTA IS .GE. THE SMALLEST EIGENVALUE OF
  3275. C        ***  (D**-1)*H*(D**-1) + ALPHAK*I.
  3276.          IF (V(DST0) .GT. ZERO) GO TO 260
  3277.          DELTA = ALPHAK + V(DST0)
  3278.          TWOPSI = ALPHAK*DST*DST + DOTPRD(P, DIG, W(Q))
  3279.          IF (DELTA .LT. PSIFAC*TWOPSI) GO TO 270
  3280. C
  3281. C  ***  UNACCEPTABLE ALPHAK -- UPDATE LK, UK, ALPHAK  ***
  3282. C
  3283.  260  IF (KA .GE. KALIM) GO TO 290
  3284.       CALL LIVMUL(P, W, L, W(Q))
  3285.       T1 = V2NORM(P, W)
  3286. C     ***  THE FOLLOWING DMIN1 IS NECESSARY BECAUSE OF RESTARTS  ***
  3287.       IF (PHI .LT. ZERO) UK = AMIN1(UK, ALPHAK)
  3288.       ALPHAK = ALPHAK  +  (PHI/T1) * (DST/T1) * (DST/RAD)
  3289.       LK = AMAX1(LK, ALPHAK)
  3290.       GO TO 210
  3291. C
  3292. C  ***  DECIDE HOW TO HANDLE (NEARLY) SINGULAR H + ALPHA*D**2  ***
  3293. C
  3294. C     ***  IF NOT YET AVAILABLE, OBTAIN MACHINE DEPENDENT VALUE DGXFAC.
  3295.  270  IF (DGXFAC .EQ. ZERO) DGXFAC = EPSFAC * RMDCON(3)
  3296. C
  3297. C     ***  NOW DECIDE.  ***
  3298.       IF (DELTA .GT. DGXFAC*W(DGGDMX)) GO TO 350
  3299. C        ***  DELTA IS SO SMALL WE CANNOT HANDLE THE SPECIAL CASE IN
  3300. C        ***  THE AVAILABLE ARITHMETIC.  ACCEPT STEP AS IT IS.
  3301.          GO TO 290
  3302. C
  3303. C  ***  ACCEPTABLE STEP ON FIRST TRY  ***
  3304. C
  3305.  280  ALPHAK = ZERO
  3306. C
  3307. C  ***  SUCCESSFUL STEP IN GENERAL.  COMPUTE STEP = -(D**-1)*Q  ***
  3308. C
  3309.  290  DO 300 I = 1, P
  3310.          J = Q0 + I
  3311.          STEP(I) = -W(J)/D(I)
  3312.  300     CONTINUE
  3313.       V(GTSTEP) = -DOTPRD(P, DIG, W(Q))
  3314.       V(PREDUC) = HALF * (ABS(ALPHAK)*DST*DST - V(GTSTEP))
  3315.       GO TO 430
  3316. C
  3317. C
  3318. C  ***  RESTART WITH NEW RADIUS  ***
  3319. C
  3320.  310  IF (V(DST0) .LE. ZERO .OR. V(DST0) - RAD .GT. PHIMAX) GO TO 330
  3321. C
  3322. C     ***  PREPARE TO RETURN NEWTON STEP  ***
  3323. C
  3324.          RESTRT = .TRUE.
  3325.          KA = KA + 1
  3326.          K = 0
  3327.          DO 320 I = 1, P
  3328.               K = K + I
  3329.               J = DIAG0 + I
  3330.               DIHDI(K) = W(J)
  3331.  320          CONTINUE
  3332.          UK = NEGONE
  3333.          GO TO 40
  3334. C
  3335.  330  IF (KA .EQ. 0) GO TO 60
  3336. C
  3337.       DST = W(DSTSAV)
  3338.       ALPHAK = ABS(V(STPPAR))
  3339.       PHI = DST - RAD
  3340.       T = V(DGNORM)/RAD
  3341.       IF (RAD .GT. V(RAD0)) GO TO 340
  3342. C
  3343. C        ***  SMALLER RADIUS  ***
  3344.          UK = T - W(EMIN)
  3345.          LK = ZERO
  3346.          IF (ALPHAK .GT. ZERO) LK = W(LK0)
  3347.          LK = AMAX1(LK, T - W(EMAX))
  3348.          IF (V(DST0) .GT. ZERO) LK = AMAX1(LK, (V(DST0)-RAD)*W(PHIPIN))
  3349.          GO TO 260
  3350. C
  3351. C     ***  BIGGER RADIUS  ***
  3352.  340  UK = T - W(EMIN)
  3353.       IF (ALPHAK .GT. ZERO) UK = AMIN1(UK, W(UK0))
  3354.       LK = AMAX1(ZERO, -V(DST0), T - W(EMAX))
  3355.       IF (V(DST0) .GT. ZERO) LK = AMAX1(LK, (V(DST0)-RAD)*W(PHIPIN))
  3356.       GO TO 260
  3357. C
  3358. C  ***  HANDLE (NEARLY) SINGULAR H + ALPHA*D**2  ***
  3359. C
  3360. C     ***  NEGATE ALPHAK TO INDICATE SPECIAL CASE  ***
  3361.  350  ALPHAK = -ALPHAK
  3362. C     ***  ALLOCATE STORAGE FOR SCRATCH VECTOR X  ***
  3363.       X0 = Q0 + P
  3364.       X = X0 + 1
  3365. C
  3366. C  ***  USE INVERSE POWER METHOD WITH START FROM LSVMIN TO OBTAIN
  3367. C  ***  APPROXIMATE EIGENVECTOR CORRESPONDING TO SMALLEST EIGENVALUE
  3368. C  ***  OF (D**-1)*H*(D**-1).
  3369. C
  3370.       DELTA = KAPPA*DELTA
  3371.       T = LSVMIN(P, L, W(X), W)
  3372. C
  3373.       K = 0
  3374. C     ***  NORMALIZE W  ***
  3375.  360  DO 370 I = 1, P
  3376.  370     W(I) = T*W(I)
  3377. C     ***  COMPLETE CURRENT INV. POWER ITER. -- REPLACE W BY (L**-T)*W.
  3378.       CALL LITVMU(P, W, L, W)
  3379.       T1 = ONE/V2NORM(P, W)
  3380.       T = T1*T
  3381.       IF (T .LE. DELTA) GO TO 390
  3382.       IF (K .GT. 30) GO TO 290
  3383.       K = K + 1
  3384. C     ***  START NEXT INV. POWER ITER. BY STORING NORMALIZED W IN X.
  3385.       DO 380 I = 1, P
  3386.          J = X0 + I
  3387.          W(J) = T1*W(I)
  3388.  380     CONTINUE
  3389. C     ***  COMPUTE W = (L**-1)*X.
  3390.       CALL LIVMUL(P, W, L, W(X))
  3391.       T = ONE/V2NORM(P, W)
  3392.       GO TO 360
  3393. C
  3394.  390  DO 400 I = 1, P
  3395.  400     W(I) = T1*W(I)
  3396. C
  3397. C  ***  NOW W IS THE DESIRED APPROXIMATE (UNIT) EIGENVECTOR AND
  3398. C  ***  T*X = ((D**-1)*H*(D**-1) + ALPHAK*I)*W.
  3399. C
  3400.       SW = DOTPRD(P, W(Q), W)
  3401.       T1 = (RAD + DST) * (RAD - DST)
  3402.       ROOT = SQRT(SW*SW + T1)
  3403.       IF (SW .LT. ZERO) ROOT = -ROOT
  3404.       SI = T1 / (SW + ROOT)
  3405. C     ***  ACCEPT CURRENT STEP IF ADDING SI*W WOULD LEAD TO A
  3406. C     ***  FURTHER RELATIVE REDUCTION IN PSI OF LESS THAN V(EPSLON)/3.
  3407.       V(PREDUC) = HALF*TWOPSI
  3408.       T1 = ZERO
  3409.       T = SI*(ALPHAK*SW - HALF*SI*(ALPHAK + T*DOTPRD(P,W(X),W)))
  3410.       IF (T .LT. EPSO6*TWOPSI) GO TO 410
  3411.          V(PREDUC) = V(PREDUC) + T
  3412.          DST = RAD
  3413.          T1 = -SI
  3414.  410  DO 420 I = 1, P
  3415.          J = Q0 + I
  3416.          W(J) = T1*W(I) - W(J)
  3417.          STEP(I) = W(J) / D(I)
  3418.  420     CONTINUE
  3419.       V(GTSTEP) = DOTPRD(P, DIG, W(Q))
  3420. C
  3421. C  ***  SAVE VALUES FOR USE IN A POSSIBLE RESTART  ***
  3422. C
  3423.  430  V(DSTNRM) = DST
  3424.       V(STPPAR) = ALPHAK
  3425.       W(LK0) = LK
  3426.       W(UK0) = UK
  3427.       V(RAD0) = RAD
  3428.       W(DSTSAV) = DST
  3429. C
  3430. C     ***  RESTORE DIAGONAL OF DIHDI  ***
  3431. C
  3432.       J = 0
  3433.       DO 440 I = 1, P
  3434.          J = J + I
  3435.          K = DIAG0 + I
  3436.          DIHDI(J) = W(K)
  3437.  440     CONTINUE
  3438.       GO TO 999
  3439. C
  3440. C  ***  SPECIAL CASE -- G = 0  ***
  3441. C
  3442.  450  V(STPPAR) = ZERO
  3443.       V(PREDUC) = ZERO
  3444.       V(DSTNRM) = ZERO
  3445.       V(GTSTEP) = ZERO
  3446.       DO 460 I = 1, P
  3447.  460     STEP(I) = ZERO
  3448. C
  3449.  999  RETURN
  3450. C
  3451. C  ***  LAST CARD OF GQTSTP FOLLOWS  ***
  3452.       END
  3453.       SUBROUTINE ITSMRY(D, IV, P, V, X)                                 ITS00010
  3454. C
  3455. C  ***  PRINT NL2SOL (VERSION 2.2) ITERATION SUMMARY  ***
  3456. C
  3457. C  ***  PARAMETER DECLARATIONS  ***
  3458. C
  3459.       INTEGER IV(1), P
  3460.       REAL D(P), V(1), X(P)
  3461. C     DIMENSION IV(*), V(*)
  3462. C
  3463. C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3464. C
  3465. C  ***  LOCAL VARIABLES  ***
  3466. C
  3467.       INTEGER COV1, G1, I, II, IV1, I1, J, M, NF, NG, OL, PU
  3468. C/6
  3469.       REAL MODEL1(6), MODEL2(6)
  3470. C/7
  3471. C     CHARACTER*4 MODEL1(6), MODEL2(6)
  3472. C/
  3473.       REAL NRELDF, OLDF, PRELDF, RELDF, ZERO
  3474. C
  3475. C  ***  INTRINSIC FUNCTIONS  ***
  3476. C/+
  3477.       INTEGER IABS
  3478. C/
  3479. C  ***  NO EXTERNAL FUNCTIONS OR SUBROUTINES  ***
  3480. C
  3481. C  ***  SUBSCRIPTS FOR IV AND V  ***
  3482. C
  3483.       INTEGER COVMAT, COVPRT, COVREQ, DSTNRM, F, FDIF, F0, G,
  3484.      1        NEEDHD, NFCALL, NFCOV, NGCOV, NGCALL, NITER, NREDUC,
  3485.      2        OUTLEV, PREDUC, PRNTIT, PRUNIT, RELDX, SIZE, SOLPRT,
  3486.      3        STATPR, STPPAR, SUSED, X0PRT
  3487. C
  3488. C  ***  IV SUBSCRIPT VALUES  ***
  3489. C
  3490. C/6
  3491.       DATA COVMAT/26/, COVPRT/14/, G/28/, COVREQ/15/,
  3492.      1     NEEDHD/39/, NFCALL/6/, NFCOV/40/, NGCOV/41/,
  3493.      2     NGCALL/30/, NITER/31/, OUTLEV/19/, PRNTIT/48/,
  3494.      3     PRUNIT/21/, SOLPRT/22/, STATPR/23/, SUSED/57/,
  3495.      4     X0PRT/24/
  3496. C/7
  3497. C     PARAMETER (COVMAT=26, COVPRT=14, G=28, COVREQ=15,
  3498. C    1     NEEDHD=39, NFCALL=6, NFCOV=40, NGCOV=41,
  3499. C    2     NGCALL=30, NITER=31, OUTLEV=19, PRNTIT=48,
  3500. C    3     PRUNIT=21, SOLPRT=22, STATPR=23, SUSED=57,
  3501. C    4     X0PRT=24)
  3502. C/
  3503. C
  3504. C  ***  V SUBSCRIPT VALUES  ***
  3505. C
  3506. C/6
  3507.       DATA DSTNRM/2/, F/10/, F0/13/, FDIF/11/, NREDUC/6/,
  3508.      1     PREDUC/7/, RELDX/17/, SIZE/47/, STPPAR/5/
  3509. C/7
  3510. C     PARAMETER (DSTNRM=2, F=10, F0=13, FDIF=11, NREDUC=6,
  3511. C    1     PREDUC=7, RELDX=17, SIZE=47, STPPAR=5)
  3512. C/
  3513. C
  3514. C/6
  3515.       DATA ZERO/0.E+0/
  3516. C/7
  3517. C     PARAMETER (ZERO=0.D+0)
  3518. C/
  3519. C/6
  3520.       DATA MODEL1(1)/4H    /, MODEL1(2)/4H    /, MODEL1(3)/4H    /,
  3521.      1     MODEL1(4)/4H    /, MODEL1(5)/4H  G /, MODEL1(6)/4H  S /,
  3522.      2     MODEL2(1)/4H G  /, MODEL2(2)/4H S  /, MODEL2(3)/4HG-S /,
  3523.      3     MODEL2(4)/4HS-G /, MODEL2(5)/4H-S-G/, MODEL2(6)/4H-G-S/
  3524. C/7
  3525. C     DATA MODEL1/'    ','    ','    ','    ','  G ','  S '/,
  3526. C    1     MODEL2/' G  ',' S  ','G-S ','S-G ','-S-G','-G-S'/
  3527. C/
  3528. C
  3529. C-----------------------------------------------------------------------
  3530. C
  3531.       PU = IV(PRUNIT)
  3532.       IF (PU .EQ. 0) GO TO 999
  3533.       IV1 = IV(1)
  3534.       OL = IV(OUTLEV)
  3535.       IF (IV1 .LT. 2 .OR. IV1 .GT. 15) GO TO 140
  3536.       IF (OL .EQ. 0) GO TO 20
  3537.       IF (IV1 .GE. 12) GO TO 20
  3538.       IF (IV1 .GE. 10 .AND. IV(PRNTIT) .EQ. 0) GO TO 20
  3539.       IF (IV1 .GT. 2) GO TO 10
  3540.          IV(PRNTIT) = IV(PRNTIT) + 1
  3541.          IF (IV(PRNTIT) .LT. IABS(OL)) GO TO 999
  3542.  10   NF = IV(NFCALL) - IABS(IV(NFCOV))
  3543.       IV(PRNTIT) = 0
  3544.       RELDF = ZERO
  3545.       PRELDF = ZERO
  3546.       OLDF = V(F0)
  3547.       IF (OLDF .LE. ZERO) GO TO 12
  3548.          RELDF = V(FDIF) / OLDF
  3549.          PRELDF = V(PREDUC) / OLDF
  3550.  12   IF (OL .GT. 0) GO TO 15
  3551. C
  3552. C        ***  PRINT SHORT SUMMARY LINE  ***
  3553. C
  3554.          IF (IV(NEEDHD) .EQ. 1) WRITE(PU, 1010)
  3555.  1010 FORMAT(12H0   IT    NF,6X,1HF,8X,5HRELDF,6X,6HPRELDF,5X,5HRELDX)
  3556.          IV(NEEDHD) = 0
  3557.          WRITE(PU,1017) IV(NITER), NF, V(F), RELDF, PRELDF, V(RELDX)
  3558.          GO TO 20
  3559. C
  3560. C     ***  PRINT LONG SUMMARY LINE  ***
  3561. C
  3562.  15   IF (IV(NEEDHD) .EQ. 1) WRITE(PU,1015)
  3563.  1015 FORMAT(12H0   IT    NF,6X,1HF,8X,5HRELDF,6X,6HPRELDF,5X,5HRELDX,
  3564.      1       4X,15HMODEL    STPPAR,6X,4HSIZE,6X,6HD*STEP,5X,7HNPRELDF)
  3565.       IV(NEEDHD) = 0
  3566.       M = IV(SUSED)
  3567.       NRELDF = ZERO
  3568.       IF (OLDF .GT. ZERO) NRELDF = V(NREDUC) / OLDF
  3569.       WRITE(PU,1017) IV(NITER), NF, V(F), RELDF, PRELDF, V(RELDX),
  3570.      1               MODEL1(M), MODEL2(M), V(STPPAR), V(SIZE),
  3571.      2               V(DSTNRM), NRELDF
  3572.  1017 FORMAT(1X,I5,I6,4E11.3,A3,A4,4E11.3)
  3573. C
  3574.  20   GO TO (999,999,30,35,40,45,50,60,70,80,90,150,110,120,130), IV1
  3575. C
  3576.  30   WRITE(PU,1030)
  3577.  1030 FORMAT(26H0***** X-CONVERGENCE *****)
  3578.       GO TO 180
  3579. C
  3580.  35   WRITE(PU,1035)
  3581.  1035 FORMAT(42H0***** RELATIVE FUNCTION CONVERGENCE *****)
  3582.       GO TO 180
  3583. C
  3584.  40   WRITE(PU,1040)
  3585.  1040 FORMAT(49H0***** X- AND RELATIVE FUNCTION CONVERGENCE *****)
  3586.       GO TO 180
  3587. C
  3588.  45   WRITE(PU,1045)
  3589.  1045 FORMAT(42H0***** ABSOLUTE FUNCTION CONVERGENCE *****)
  3590.       GO TO 180
  3591. C
  3592.  50   WRITE(PU,1050)
  3593.  1050 FORMAT(33H0***** SINGULAR CONVERGENCE *****)
  3594.       GO TO 180
  3595. C
  3596.  60   WRITE(PU,1060)
  3597.  1060 FORMAT(30H0***** FALSE CONVERGENCE *****)
  3598.       GO TO 180
  3599. C
  3600.  70   WRITE(PU,1070)
  3601.  1070 FORMAT(38H0***** FUNCTION EVALUATION LIMIT *****)
  3602.       GO TO 180
  3603. C
  3604.  80   WRITE(PU,1080)
  3605.  1080 FORMAT(28H0***** ITERATION LIMIT *****)
  3606.       GO TO 180
  3607. C
  3608.  90   WRITE(PU,1090)
  3609.  1090 FORMAT(18H0***** STOPX *****)
  3610.       GO TO 180
  3611. C
  3612.  110  WRITE(PU,1100)
  3613.  1100 FORMAT(45H0***** INITIAL SUM OF SQUARES OVERFLOWS *****)
  3614. C
  3615.       GO TO 150
  3616. C
  3617.  120  WRITE(PU,1120)
  3618.  1120 FORMAT(37H0***** BAD PARAMETERS TO ASSESS *****)
  3619.       GO TO 999
  3620. C
  3621.  130  WRITE(PU,1130)
  3622.  1130 FORMAT(36H0***** J COULD NOT BE COMPUTED *****)
  3623.       IF (IV(NITER) .GT. 0) GO TO 190
  3624.       GO TO 150
  3625. C
  3626.  140  WRITE(PU,1140) IV1
  3627.  1140 FORMAT(14H0***** IV(1) =,I5,6H *****)
  3628.       GO TO 999
  3629. C
  3630. C  ***  INITIAL CALL ON ITSMRY  ***
  3631. C
  3632.  150  IF (IV(X0PRT) .NE. 0) WRITE(PU,1150) (I, X(I), D(I), I = 1, P)
  3633.  1150 FORMAT(23H0    I     INITIAL X(I),7X,4HD(I)//(1X,I5,E17.6,E14.3))
  3634.       IF (IV1 .GE. 13) GO TO 999
  3635.       IV(NEEDHD) = 0
  3636.       IV(PRNTIT) = 0
  3637.       IF (OL .EQ. 0) GO TO 999
  3638.       IF (OL .LT. 0) WRITE(PU,1010)
  3639.       IF (OL .GT. 0) WRITE(PU,1015)
  3640.       WRITE(PU,1160) V(F)
  3641.  1160 FORMAT(12H0    0     1,E11.3,11X,E11.3)
  3642.       GO TO 999
  3643. C
  3644. C  ***  PRINT VARIOUS INFORMATION REQUESTED ON SOLUTION  ***
  3645. C
  3646.  180  IV(NEEDHD) = 1
  3647.       IF (IV(STATPR) .EQ. 0) GO TO 190
  3648.          OLDF = V(F0)
  3649.          PRELDF = ZERO
  3650.          NRELDF = ZERO
  3651.          IF (OLDF .LE. ZERO) GO TO 185
  3652.               PRELDF = V(PREDUC) / OLDF
  3653.               NRELDF = V(NREDUC) / OLDF
  3654.  185     NF = IV(NFCALL) - IV(NFCOV)
  3655.          NG = IV(NGCALL) - IV(NGCOV)
  3656.          WRITE(PU,1180) V(F), V(RELDX), NF, NG, PRELDF, NRELDF
  3657.  1180 FORMAT(9H0FUNCTION,E17.6,8H   RELDX,E20.6/12H FUNC. EVALS,
  3658.      1   I8,9X,11HGRAD. EVALS,I8/7H PRELDF,E19.6,3X,7HNPRELDF,E18.6)
  3659. C
  3660.          IF (IV(NFCOV) .GT. 0) WRITE(PU,1185) IV(NFCOV)
  3661.  1185    FORMAT(1H0,I4,34H EXTRA FUNC. EVALS FOR COVARIANCE.)
  3662.          IF (IV(NGCOV) .GT. 0) WRITE(PU,1186) IV(NGCOV)
  3663.  1186    FORMAT(1X,I4,34H EXTRA GRAD. EVALS FOR COVARIANCE.)
  3664. C
  3665.  190  IF (IV(SOLPRT) .EQ. 0) GO TO 210
  3666.          IV(NEEDHD) = 1
  3667.          G1 = IV(G)
  3668.          WRITE(PU,1190)
  3669.  1190 FORMAT(22H0    I      FINAL X(I),8X,4HD(I),10X,4HG(I)/)
  3670.          DO 200 I = 1, P
  3671.               WRITE(PU,1200) I, X(I), D(I), V(G1)
  3672.               G1 = G1 + 1
  3673.  200          CONTINUE
  3674.  1200    FORMAT(1X,I5,E17.6,2E14.3)
  3675. C
  3676.  210  IF (IV(COVPRT) .EQ. 0) GO TO 999
  3677.       COV1 = IV(COVMAT)
  3678.       IV(NEEDHD) = 1
  3679.       IF (COV1) 220, 230, 240
  3680.  220  IF (-1 .EQ. COV1) WRITE(PU,1220)
  3681.  1220 FORMAT(43H0++++++ INDEFINITE COVARIANCE MATRIX ++++++)
  3682.       IF (-2 .EQ. COV1) WRITE(PU,1225)
  3683.  1225 FORMAT(52H0++++++ OVERSIZE STEPS IN COMPUTING COVARIANCE +++++)
  3684.       GO TO 999
  3685. C
  3686.  230  WRITE(PU,1230)
  3687.  1230 FORMAT(45H0++++++ COVARIANCE MATRIX NOT COMPUTED ++++++)
  3688.       GO TO 999
  3689. C
  3690.  240  I = IABS(IV(COVREQ))
  3691.       IF (I .LE. 1) WRITE(PU,1241)
  3692.  1241 FORMAT(48H0COVARIANCE = SCALE * H**-1 * (J**T * J) * H**-1/)
  3693.       IF (I .EQ. 2) WRITE(PU,1242)
  3694.  1242 FORMAT(27H0COVARIANCE = SCALE * H**-1/)
  3695.       IF (I .GE. 3) WRITE(PU,1243)
  3696.  1243 FORMAT(36H0COVARIANCE = SCALE * (J**T * J)**-1/)
  3697.       II = COV1 - 1
  3698.       IF (OL .LE. 0) GO TO 260
  3699.       DO 250 I = 1, P
  3700.          I1 = II + 1
  3701.          II = II + I
  3702.          WRITE(PU,1250) I, (V(J), J = I1, II)
  3703.  250     CONTINUE
  3704.  1250 FORMAT(4H ROW,I3,2X,9E12.4/(9X,9E12.4))
  3705.       GO TO 999
  3706. C
  3707.  260  DO 270 I = 1, P
  3708.          I1 = II + 1
  3709.          II = II + I
  3710.          WRITE(PU,1270) I, (V(J), J = I1, II)
  3711.  270     CONTINUE
  3712.  1270 FORMAT(4H ROW,I3,2X,5E12.4/(9X,5E12.4))
  3713. C
  3714.  999  RETURN
  3715. C  ***  LAST CARD OF ITSMRY FOLLOWS  ***
  3716.       END
  3717.       SUBROUTINE LINVRT(N, LIN, L)                                      LIN00010
  3718. C
  3719. C  ***  COMPUTE  LIN = L**-1,  BOTH  N X N  LOWER TRIANG. STORED   ***
  3720. C  ***  COMPACTLY BY ROWS.  LIN AND L MAY SHARE THE SAME STORAGE.  ***
  3721. C
  3722. C  ***  PARAMETERS  ***
  3723. C
  3724.       INTEGER N
  3725.       REAL L(1), LIN(1)
  3726. C     DIMENSION L(N*(N+1)/2), LIN(N*(N+1)/2)
  3727. C
  3728. C  ***  LOCAL VARIABLES  ***
  3729. C
  3730.       INTEGER I, II, IM1, JJ, J0, J1, K, K0, NP1
  3731.       REAL ONE, T, ZERO
  3732. C/6
  3733.       DATA ONE/1.E+0/, ZERO/0.E+0/
  3734. C/7
  3735. C     PARAMETER (ONE=1.D+0, ZERO=0.D+0)
  3736. C/
  3737. C
  3738. C  ***  BODY  ***
  3739. C
  3740.       NP1 = N + 1
  3741.       J0 = N*(NP1)/2
  3742.       DO 30 II = 1, N
  3743.          I = NP1 - II
  3744.          LIN(J0) = ONE/L(J0)
  3745.          IF (I .LE. 1) GO TO 999
  3746.          J1 = J0
  3747.          IM1 = I - 1
  3748.          DO 20 JJ = 1, IM1
  3749.               T = ZERO
  3750.               J0 = J1
  3751.               K0 = J1 - JJ
  3752.               DO 10 K = 1, JJ
  3753.                    T = T - L(K0)*LIN(J0)
  3754.                    J0 = J0 - 1
  3755.                    K0 = K0 + K - I
  3756.  10                CONTINUE
  3757.               LIN(J0) = T/L(K0)
  3758.  20           CONTINUE
  3759.          J0 = J0 - 1
  3760.  30      CONTINUE
  3761.  999  RETURN
  3762. C  ***  LAST CARD OF LINVRT FOLLOWS  ***
  3763.       END
  3764.       SUBROUTINE LITVMU(N, X, L, Y)                                     LIT00010
  3765. C
  3766. C  ***  SOLVE  (L**T)*X = Y,  WHERE  L  IS AN  N X N  LOWER TRIANGULAR
  3767. C  ***  MATRIX STORED COMPACTLY BY ROWS.  X AND Y MAY OCCUPY THE SAME
  3768. C  ***  STORAGE.  ***
  3769. C
  3770.       INTEGER N
  3771.       REAL X(N), L(1), Y(N)
  3772.       INTEGER I, II, IJ, IM1, I0, J, NP1
  3773.       REAL XI, ZERO
  3774. C/6
  3775.       DATA ZERO/0.E+0/
  3776. C/7
  3777. C     PARAMETER (ZERO=0.D+0)
  3778. C/
  3779. C
  3780.       DO 10 I = 1, N
  3781.  10      X(I) = Y(I)
  3782.       NP1 = N + 1
  3783.       I0 = N*(N+1)/2
  3784.       DO 30 II = 1, N
  3785.          I = NP1 - II
  3786.          XI = X(I)/L(I0)
  3787.          X(I) = XI
  3788.          IF (I .LE. 1) GO TO 999
  3789.          I0 = I0 - I
  3790.          IF (XI .EQ. ZERO) GO TO 30
  3791.          IM1 = I - 1
  3792.          DO 20 J = 1, IM1
  3793.               IJ = I0 + J
  3794.               X(J) = X(J) - XI*L(IJ)
  3795.  20           CONTINUE
  3796.  30      CONTINUE
  3797.  999  RETURN
  3798. C  ***  LAST CARD OF LITVMU FOLLOWS  ***
  3799.       END
  3800.       SUBROUTINE LIVMUL(N, X, L, Y)                                     LIV00010
  3801. C
  3802. C  ***  SOLVE  L*X = Y, WHERE  L  IS AN  N X N  LOWER TRIANGULAR
  3803. C  ***  MATRIX STORED COMPACTLY BY ROWS.  X AND Y MAY OCCUPY THE SAME
  3804. C  ***  STORAGE.  ***
  3805. C
  3806.       INTEGER N
  3807.       REAL X(N), L(1), Y(N)
  3808.       EXTERNAL DOTPRD
  3809.       REAL DOTPRD
  3810.       INTEGER I, J, K
  3811.       REAL T, ZERO
  3812. C/6
  3813.       DATA ZERO/0.E+0/
  3814. C/7
  3815. C     PARAMETER (ZERO=0.D+0)
  3816. C/
  3817. C
  3818.       DO 10 K = 1, N
  3819.          IF (Y(K) .NE. ZERO) GO TO 20
  3820.          X(K) = ZERO
  3821.  10      CONTINUE
  3822.       GO TO 999
  3823.  20   J = K*(K+1)/2
  3824.       X(K) = Y(K) / L(J)
  3825.       IF (K .GE. N) GO TO 999
  3826.       K = K + 1
  3827.       DO 30 I = K, N
  3828.          T = DOTPRD(I-1, L(J+1), X)
  3829.          J = J + I
  3830.          X(I) = (Y(I) - T)/L(J)
  3831.  30      CONTINUE
  3832.  999  RETURN
  3833. C  ***  LAST CARD OF LIVMUL FOLLOWS  ***
  3834.       END
  3835.       SUBROUTINE LMSTEP(D, G, IERR, IPIVOT, KA, P, QTR, R, STEP, V, W)  LMS00010
  3836. C
  3837. C  ***  COMPUTE LEVENBERG-MARQUARDT STEP USING MORE-HEBDEN TECHNIQUE  **
  3838. C  ***  NL2SOL VERSION 2.2.  ***
  3839. C
  3840. C  ***  PARAMETER DECLARATIONS  ***
  3841. C
  3842.       INTEGER IERR, KA, P
  3843.       INTEGER IPIVOT(P)
  3844.       REAL D(P), G(P), QTR(P), R(1), STEP(P), V(21), W(1)
  3845. C     DIMENSION W(P*(P+5)/2 + 4)
  3846. C
  3847. C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3848. C
  3849. C  ***  PURPOSE  ***
  3850. C
  3851. C        GIVEN THE R MATRIX FROM THE QR DECOMPOSITION OF A JACOBIAN
  3852. C     MATRIX, J, AS WELL AS Q-TRANSPOSE TIMES THE CORRESPONDING
  3853. C     RESIDUAL VECTOR, RESID, THIS SUBROUTINE COMPUTES A LEVENBERG-
  3854. C     MARQUARDT STEP OF APPROXIMATE LENGTH V(RADIUS) BY THE MORE-
  3855. C     TECHNIQUE.
  3856. C
  3857. C  ***  PARAMETER DESCRIPTION  ***
  3858. C
  3859. C      D (IN)  = THE SCALE VECTOR.
  3860. C      G (IN)  = THE GRADIENT VECTOR (J**T)*R.
  3861. C   IERR (I/O) = RETURN CODE FROM QRFACT OR QRFGS -- 0 MEANS R HAS
  3862. C             FULL RANK.
  3863. C IPIVOT (I/O) = PERMUTATION ARRAY FROM QRFACT OR QRFGS, WHICH COMPUTE
  3864. C             QR DECOMPOSITIONS WITH COLUMN PIVOTING.
  3865. C     KA (I/O).  KA .LT. 0 ON INPUT MEANS THIS IS THE FIRST CALL ON
  3866. C             LMSTEP FOR THE CURRENT R AND QTR.  ON OUTPUT KA CON-
  3867. C             TAINS THE NUMBER OF HEBDEN ITERATIONS NEEDED TO DETERMINE
  3868. C             STEP.  KA = 0 MEANS A GAUSS-NEWTON STEP.
  3869. C      P (IN)  = NUMBER OF PARAMETERS.
  3870. C    QTR (IN)  = (Q**T)*RESID = Q-TRANSPOSE TIMES THE RESIDUAL VECTOR.
  3871. C      R (IN)  = THE R MATRIX, STORED COMPACTLY BY COLUMNS.
  3872. C   STEP (OUT) = THE LEVENBERG-MARQUARDT STEP COMPUTED.
  3873. C      V (I/O) CONTAINS VARIOUS CONSTANTS AND VARIABLES DESCRIBED BELOW.
  3874. C      W (I/O) = WORKSPACE OF LENGTH P*(P+5)/2 + 4.
  3875. C
  3876. C  ***  ENTRIES IN V  ***
  3877. C
  3878. C V(DGNORM) (I/O) = 2-NORM OF (D**-1)*G.
  3879. C V(DSTNRM) (I/O) = 2-NORM OF D*STEP.
  3880. C V(DST0)   (I/O) = 2-NORM OF GAUSS-NEWTON STEP (FOR NONSING. J).
  3881. C V(EPSLON) (IN) = MAX. REL. ERROR ALLOWED IN TWONORM(R)**2 MINUS
  3882. C             TWONORM(R - J*STEP)**2.  (SEE ALGORITHM NOTES BELOW.)
  3883. C V(GTSTEP) (OUT) = INNER PRODUCT BETWEEN G AND STEP.
  3884. C V(NREDUC) (OUT) = HALF THE REDUCTION IN THE SUM OF SQUARES PREDICTED
  3885. C             FOR A GAUSS-NEWTON STEP.
  3886. C V(PHMNFC) (IN)  = TOL. (TOGETHER WITH V(PHMXFC)) FOR ACCEPTING STEP
  3887. C             (MORE*S SIGMA).  THE ERROR V(DSTNRM) - V(RADIUS) MUST LIE
  3888. C             BETWEEN V(PHMNFC)*V(RADIUS) AND V(PHMXFC)*V(RADIUS).
  3889. C V(PHMXFC) (IN)  (SEE V(PHMNFC).)
  3890. C V(PREDUC) (OUT) = HALF THE REDUCTION IN THE SUM OF SQUARES PREDICTED
  3891. C             BY THE STEP RETURNED.
  3892. C V(RADIUS) (IN)  = RADIUS OF CURRENT (SCALED) TRUST REGION.
  3893. C V(RAD0)   (I/O) = VALUE OF V(RADIUS) FROM PREVIOUS CALL.
  3894. C V(STPPAR) (I/O) = MARQUARDT PARAMETER (OR ITS NEGATIVE IF THE SPECIAL
  3895. C             CASE MENTIONED BELOW IN THE ALGORITHM NOTES OCCURS).
  3896. C
  3897. C NOTE -- SEE DATA STATEMENT BELOW FOR VALUES OF ABOVE SUBSCRIPTS.
  3898. C
  3899. C  ***  USAGE NOTES  ***
  3900. C
  3901. C     IF IT IS DESIRED TO RECOMPUTE STEP USING A DIFFERENT VALUE OF
  3902. C     V(RADIUS), THEN THIS ROUTINE MAY BE RESTARTED BY CALLING IT
  3903. C     WITH ALL PARAMETERS UNCHANGED EXCEPT V(RADIUS).  (THIS EXPLAINS
  3904. C     WHY MANY PARAMETERS ARE LISTED AS I/O).  ON AN INTIIAL CALL (ONE
  3905. C     WITH KA = -1), THE CALLER NEED ONLY HAVE INITIALIZED D, G, KA, P,
  3906. C     QTR, R, V(EPSLON), V(PHMNFC), V(PHMXFC), V(RADIUS), AND V(RAD0).
  3907. C
  3908. C  ***  APPLICATION AND USAGE RESTRICTIONS  ***
  3909. C
  3910. C     THIS ROUTINE IS CALLED AS PART OF THE NL2SOL (NONLINEAR LEAST-
  3911. C     SQUARES) PACKAGE (REF. 1).
  3912. C
  3913. C  ***  ALGORITHM NOTES  ***
  3914. C
  3915. C     THIS CODE IMPLEMENTS THE STEP COMPUTATION SCHEME DESCRIBED IN
  3916. C     REFS. 2 AND 4.  FAST GIVENS TRANSFORMATIONS (SEE REF. 3, PP. 60-
  3917. C     62) ARE USED TO COMPUTE STEP WITH A NONZERO MARQUARDT PARAMETER.
  3918. C        A SPECIAL CASE OCCURS IF J IS (NEARLY) SINGULAR AND V(RADIUS)
  3919. C     IS SUFFICIENTLY LARGE.  IN THIS CASE THE STEP RETURNED IS SUCH
  3920. C     THAT  TWONORM(R)**2 - TWONORM(R - J*STEP)**2  DIFFERS FROM ITS
  3921. C     OPTIMAL VALUE BY LESS THAN V(EPSLON) TIMES THIS OPTIMAL VALUE,
  3922. C     WHERE J AND R DENOTE THE ORIGINAL JACOBIAN AND RESIDUAL.  (SEE
  3923. C     REF. 2 FOR MORE DETAILS.)
  3924. C
  3925. C  ***  FUNCTIONS AND SUBROUTINES CALLED  ***
  3926. C
  3927. C DOTPRD - RETURNS INNER PRODUCT OF TWO VECTORS.
  3928. C LITVMU - APPLY INVERSE-TRANSPOSE OF COMPACT LOWER TRIANG. MATRIX.
  3929. C LIVMUL - APPLY INVERSE OF COMPACT LOWER TRIANG. MATRIX.
  3930. C VCOPY  - COPIES ONE VECTOR TO ANOTHER.
  3931. C V2NORM - RETURNS 2-NORM OF A VECTOR.
  3932. C
  3933. C  ***  REFERENCES  ***
  3934. C
  3935. C 1.  DENNIS, J.E., GAY, D.M., AND WELSCH, R.E. (1981), AN ADAPTIVE
  3936. C             NONLINEAR LEAST-SQUARES ALGORITHM, ACM TRANS. MATH.
  3937. C             SOFTWARE, VOL. 7, NO. 3.
  3938. C 2.  GAY, D.M. (1981), COMPUTING OPTIMAL LOCALLY CONSTRAINED
  3939. C             SIAM J. SCI. STATIST. COMPUTING, VOL. 2, NO. 2,
  3940. C             186-197.
  3941. C 3.  LAWSON, C.L., AND HANSON, R.J. (1974), SOLVING LEAST SQUARES
  3942. C             PROBLEMS, PRENTICE-HALL, ENGLEWOOD CLIFFS, N.J.
  3943. C 4.  MORE, J.J. (1978), THE LEVENBERG-MARQUARDT ALGORITHM, IMPLEMEN-
  3944. C             TATION AND THEORY, PP.105-116 OF SPRINGER LECTURE NOTES
  3945. C             IN MATHEMATICS NO. 630, EDITED BY G.A. WATSON, SPRINGER-
  3946. C             VERLAG, BERLIN AND NEW YORK.
  3947. C
  3948. C  ***  GENERAL  ***
  3949. C
  3950. C     CODED BY DAVID M. GAY.
  3951. C     THIS SUBROUTINE WAS WRITTEN IN CONNECTION WITH RESEARCH
  3952. C     SUPPORTED BY THE NATIONAL SCIENCE FOUNDATION UNDER GRANTS
  3953. C     MCS-7600324, DCR75-10143, 76-14311DSS, MCS76-11989, AND
  3954. C     MCS-7906671.
  3955. C
  3956. C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3957. C
  3958. C  ***  LOCAL VARIABLES  ***
  3959. C
  3960.       INTEGER DSTSAV, I, IP1, I1, J1, K, KALIM, L, LK0, PHIPIN,
  3961.      1        PP1O2, RES, RES0, RMAT, RMAT0, UK0
  3962.       REAL A, ADI, ALPHAK, B, DFACSQ, DST, DTOL, D1, D2,
  3963.      1                 LK, OLDPHI, PHI, PHIMAX, PHIMIN, PSIFAC, RAD,
  3964.      2                 SI, SJ, SQRTAK, T, TWOPSI, UK, WL
  3965. C
  3966. C     ***  CONSTANTS  ***
  3967.       REAL DFAC, EIGHT, HALF, NEGONE, ONE, P001, THREE,
  3968.      1                 TTOL, ZERO
  3969. C
  3970. C  ***  INTRINSIC FUNCTIONS  ***
  3971. C/+
  3972.       INTEGER IABS
  3973.       REAL ABS, AMAX1, AMIN1, SQRT
  3974. C/
  3975. C  ***  EXTERNAL FUNCTIONS AND SUBROUTINES  ***
  3976. C
  3977.       EXTERNAL DOTPRD, LITVMU, LIVMUL, VCOPY, V2NORM
  3978.       REAL DOTPRD, V2NORM
  3979. C
  3980. C  ***  SUBSCRIPTS FOR V  ***
  3981. C
  3982.       INTEGER DGNORM, DSTNRM, DST0, EPSLON, GTSTEP, NREDUC, PHMNFC,
  3983.      1        PHMXFC, PREDUC, RADIUS, RAD0, STPPAR
  3984. C/6
  3985.       DATA DGNORM/1/, DSTNRM/2/, DST0/3/, EPSLON/19/,
  3986.      1     GTSTEP/4/, NREDUC/6/, PHMNFC/20/,
  3987.      2     PHMXFC/21/, PREDUC/7/, RADIUS/8/,
  3988.      3     RAD0/9/, STPPAR/5/
  3989. C/7
  3990. C     PARAMETER (DGNORM=1, DSTNRM=2, DST0=3, EPSLON=19,
  3991. C    1     GTSTEP=4, NREDUC=6, PHMNFC=20,
  3992. C    2     PHMXFC=21, PREDUC=7, RADIUS=8,
  3993. C    3     RAD0=9, STPPAR=5)
  3994. C/
  3995. C
  3996. C/6
  3997.       DATA DFAC/256.E+0/, EIGHT/8.E+0/, HALF/0.5E+0/, NEGONE/-1.E+0/,
  3998.      1     ONE/1.E+0/, P001/1.E-3/, THREE/3.E+0/, TTOL/2.5E+0/,
  3999.      2     ZERO/0.E+0/
  4000. C/7
  4001. C     PARAMETER (DFAC=256.D+0, EIGHT=8.D+0, HALF=0.5D+0, NEGONE=-1.D+0,
  4002. C    1     ONE=1.D+0, P001=1.D-3, THREE=3.D+0, TTOL=2.5D+0,
  4003. C    2     ZERO=0.D+0)
  4004. C/
  4005. C
  4006. C  ***  BODY  ***
  4007. C
  4008. C     ***  FOR USE IN RECOMPUTING STEP, THE FINAL VALUES OF LK AND UK,
  4009. C     ***  THE INVERSE DERIVATIVE OF MORE*S PHI AT 0 (FOR NONSING. J)
  4010. C     ***  AND THE VALUE RETURNED AS V(DSTNRM) ARE STORED AT W(LK0),
  4011. C     ***  W(UK0), W(PHIPIN), AND W(DSTSAV) RESPECTIVELY.
  4012.       LK0 = P + 1
  4013.       PHIPIN = LK0 + 1
  4014.       UK0 = PHIPIN + 1
  4015.       DSTSAV = UK0 + 1
  4016.       RMAT0 = DSTSAV
  4017. C     ***  A COPY OF THE R-MATRIX FROM THE QR DECOMPOSITION OF J IS
  4018. C     ***  STORED IN W STARTING AT W(RMAT), AND A COPY OF THE RESIDUAL
  4019. C     ***  VECTOR IS STORED IN W STARTING AT W(RES).  THE LOOPS BELOW
  4020. C     ***  THAT UPDATE THE QR DECOMP. FOR A NONZERO MARQUARDT PARAMETER
  4021. C     ***  WORK ON THESE COPIES.
  4022.       RMAT = RMAT0 + 1
  4023.       PP1O2 = P * (P + 1) / 2
  4024.       RES0 = PP1O2 + RMAT0
  4025.       RES = RES0 + 1
  4026.       RAD = V(RADIUS)
  4027.       IF (RAD .GT. ZERO)
  4028.      1   PSIFAC = V(EPSLON)/((EIGHT*(V(PHMNFC) + ONE) + THREE) * RAD**2)
  4029.       PHIMAX = V(PHMXFC) * RAD
  4030.       PHIMIN = V(PHMNFC) * RAD
  4031. C     ***  DTOL, DFAC, AND DFACSQ ARE USED IN RESCALING THE FAST GIVENS
  4032. C     ***  REPRESENTATION OF THE UPDATED QR DECOMPOSITION.
  4033.       DTOL = ONE/DFAC
  4034.       DFACSQ = DFAC*DFAC
  4035. C     ***  OLDPHI IS USED TO DETECT LIMITS OF NUMERICAL ACCURACY.  IF
  4036. C     ***  WE RECOMPUTE STEP AND IT DOES NOT CHANGE, THEN WE ACCEPT IT.
  4037.       OLDPHI = ZERO
  4038.       LK = ZERO
  4039.       UK = ZERO
  4040.       KALIM = KA + 12
  4041. C
  4042. C  ***  START OR RESTART, DEPENDING ON KA  ***
  4043. C
  4044.       IF (KA) 10, 20, 370
  4045. C
  4046. C  ***  FRESH START -- COMPUTE V(NREDUC)  ***
  4047. C
  4048.  10   KA = 0
  4049.       KALIM = 12
  4050.       K = P
  4051.       IF (IERR .NE. 0) K = IABS(IERR) - 1
  4052.       V(NREDUC) = HALF*DOTPRD(K, QTR, QTR)
  4053. C
  4054. C  ***  SET UP TO TRY INITIAL GAUSS-NEWTON STEP  ***
  4055. C
  4056.  20   V(DST0) = NEGONE
  4057.       IF (IERR .NE. 0) GO TO 90
  4058. C
  4059. C  ***  COMPUTE GAUSS-NEWTON STEP  ***
  4060. C
  4061. C     ***  NOTE -- THE R-MATRIX IS STORED COMPACTLY BY COLUMNS IN
  4062. C     ***  R(1), R(2), R(3), ...  IT IS THE TRANSPOSE OF A
  4063. C     ***  LOWER TRIANGULAR MATRIX STORED COMPACTLY BY ROWS, AND WE
  4064. C     ***  TREAT IT AS SUCH WHEN USING LITVMU AND LIVMUL.
  4065.       CALL LITVMU(P, W, R, QTR)
  4066. C     ***  TEMPORARILY STORE PERMUTED -D*STEP IN STEP.
  4067.       DO 60 I = 1, P
  4068.          J1 = IPIVOT(I)
  4069.          STEP(I) = D(J1)*W(I)
  4070.  60      CONTINUE
  4071.       DST = V2NORM(P, STEP)
  4072.       V(DST0) = DST
  4073.       PHI = DST - RAD
  4074.       IF (PHI .LE. PHIMAX) GO TO 410
  4075. C     ***  IF THIS IS A RESTART, GO TO 110  ***
  4076.       IF (KA .GT. 0) GO TO 110
  4077. C
  4078. C  ***  GAUSS-NEWTON STEP WAS UNACCEPTABLE.  COMPUTE L0  ***
  4079. C
  4080.       DO 70 I = 1, P
  4081.          J1 = IPIVOT(I)
  4082.          STEP(I) = D(J1)*(STEP(I)/DST)
  4083.  70      CONTINUE
  4084.       CALL LIVMUL(P, STEP, R, STEP)
  4085.       T = ONE / V2NORM(P, STEP)
  4086.       W(PHIPIN) = (T/DST)*T
  4087.       LK = PHI*W(PHIPIN)
  4088. C
  4089. C  ***  COMPUTE U0  ***
  4090. C
  4091.  90   DO 100 I = 1, P
  4092.  100     W(I) = G(I)/D(I)
  4093.       V(DGNORM) = V2NORM(P, W)
  4094.       UK = V(DGNORM)/RAD
  4095.       IF (UK .LE. ZERO) GO TO 390
  4096. C
  4097. C     ***  ALPHAK WILL BE USED AS THE CURRENT MARQUARDT PARAMETER.  WE
  4098. C     ***  USE MORE*S SCHEME FOR INITIALIZING IT.
  4099.       ALPHAK = ABS(V(STPPAR)) * V(RAD0)/RAD
  4100. C
  4101. C
  4102. C  ***  TOP OF LOOP -- INCREMENT KA, COPY R TO RMAT, QTR TO RES  ***
  4103. C
  4104.  110  KA = KA + 1
  4105.       CALL VCOPY(PP1O2, W(RMAT), R)
  4106.       CALL VCOPY(P, W(RES), QTR)
  4107. C
  4108. C  ***  SAFEGUARD ALPHAK AND INITIALIZE FAST GIVENS SCALE VECTOR.  ***
  4109. C
  4110.       IF (ALPHAK .LE. ZERO .OR. ALPHAK .LT. LK .OR. ALPHAK .GE. UK)
  4111.      1             ALPHAK = UK * AMAX1(P001, SQRT(LK/UK))
  4112.       SQRTAK = SQRT(ALPHAK)
  4113.       DO 120 I = 1, P
  4114.  120     W(I) = ONE
  4115. C
  4116. C  ***  ADD ALPHAK*D AND UPDATE QR DECOMP. USING FAST GIVENS TRANS.  ***
  4117. C
  4118.       DO 270 I = 1, P
  4119. C        ***  GENERATE, APPLY 1ST GIVENS TRANS. FOR ROW I OF ALPHAK*D.
  4120. C        ***  (USE STEP TO STORE TEMPORARY ROW)  ***
  4121.          L = I*(I+1)/2 + RMAT0
  4122.          WL = W(L)
  4123.          D2 = ONE
  4124.          D1 = W(I)
  4125.          J1 = IPIVOT(I)
  4126.          ADI = SQRTAK*D(J1)
  4127.          IF (ADI .GE. ABS(WL)) GO TO 150
  4128.  130     A = ADI/WL
  4129.          B = D2*A/D1
  4130.          T = A*B + ONE
  4131.          IF (T .GT. TTOL) GO TO 150
  4132.          W(I) = D1/T
  4133.          D2 = D2/T
  4134.          W(L) = T*WL
  4135.          A = -A
  4136.          DO 140 J1 = I, P
  4137.               L = L + J1
  4138.               STEP(J1) = A*W(L)
  4139.  140          CONTINUE
  4140.          GO TO 170
  4141. C
  4142.  150     B = WL/ADI
  4143.          A = D1*B/D2
  4144.          T = A*B + ONE
  4145.          IF (T .GT. TTOL) GO TO 130
  4146.          W(I) = D2/T
  4147.          D2 = D1/T
  4148.          W(L) = T*ADI
  4149.          DO 160 J1 = I, P
  4150.               L = L + J1
  4151.               WL = W(L)
  4152.               STEP(J1) = -WL
  4153.               W(L) = A*WL
  4154.  160          CONTINUE
  4155. C
  4156.  170     IF (I .EQ. P) GO TO 280
  4157. C
  4158. C        ***  NOW USE GIVENS TRANS. TO ZERO ELEMENTS OF TEMP. ROW  ***
  4159. C
  4160.          IP1 = I + 1
  4161.          DO 260 I1 = IP1, P
  4162.               L = I1*(I1+1)/2 + RMAT0
  4163.               WL = W(L)
  4164.               SI = STEP(I1-1)
  4165.               D1 = W(I1)
  4166. C
  4167. C             ***  RESCALE ROW I1 IF NECESSARY  ***
  4168. C
  4169.               IF (D1 .GE. DTOL) GO TO 190
  4170.                    D1 = D1*DFACSQ
  4171.                    WL = WL/DFAC
  4172.                    K = L
  4173.                    DO 180 J1 = I1, P
  4174.                         K = K + J1
  4175.                         W(K) = W(K)/DFAC
  4176.  180                    CONTINUE
  4177. C
  4178. C             ***  USE GIVENS TRANS. TO ZERO NEXT ELEMENT OF TEMP. ROW
  4179. C
  4180.  190          IF (ABS(SI) .GT. ABS(WL)) GO TO 220
  4181.               IF (SI .EQ. ZERO) GO TO 260
  4182.  200          A = SI/WL
  4183.               B = D2*A/D1
  4184.               T = A*B + ONE
  4185.               IF (T .GT. TTOL) GO TO 220
  4186.               W(L) = T*WL
  4187.               W(I1) = D1/T
  4188.               D2 = D2/T
  4189.               DO 210 J1 = I1, P
  4190.                    L = L + J1
  4191.                    WL = W(L)
  4192.                    SJ = STEP(J1)
  4193.                    W(L) = WL + B*SJ
  4194.                    STEP(J1) = SJ - A*WL
  4195.  210               CONTINUE
  4196.               GO TO 240
  4197. C
  4198.  220          B = WL/SI
  4199.               A = D1*B/D2
  4200.               T = A*B + ONE
  4201.               IF (T .GT. TTOL) GO TO 200
  4202.               W(I1) = D2/T
  4203.               D2 = D1/T
  4204.               W(L) = T*SI
  4205.               DO 230 J1 = I1, P
  4206.                    L = L + J1
  4207.                    WL = W(L)
  4208.                    SJ = STEP(J1)
  4209.                    W(L) = A*WL + SJ
  4210.                    STEP(J1) = B*SJ - WL
  4211.  230               CONTINUE
  4212. C
  4213. C             ***  RESCALE TEMP. ROW IF NECESSARY  ***
  4214. C
  4215.  240          IF (D2 .GE. DTOL) GO TO 260
  4216.                    D2 = D2*DFACSQ
  4217.                    DO 250 K = I1, P
  4218.  250                    STEP(K) = STEP(K)/DFAC
  4219.  260          CONTINUE
  4220.  270     CONTINUE
  4221. C
  4222. C  ***  COMPUTE STEP  ***
  4223. C
  4224.  280  CALL LITVMU(P, W(RES), W(RMAT), W(RES))
  4225. C     ***  RECOVER STEP AND STORE PERMUTED -D*STEP AT W(RES)  ***
  4226.       DO 290 I = 1, P
  4227.          J1 = IPIVOT(I)
  4228.          K = RES0 + I
  4229.          T = W(K)
  4230.          STEP(J1) = -T
  4231.          W(K) = T*D(J1)
  4232.  290     CONTINUE
  4233.       DST = V2NORM(P, W(RES))
  4234.       PHI = DST - RAD
  4235.       IF (PHI .LE. PHIMAX .AND. PHI .GE. PHIMIN) GO TO 430
  4236.       IF (OLDPHI .EQ. PHI) GO TO 430
  4237.       OLDPHI = PHI
  4238. C
  4239. C  ***  CHECK FOR (AND HANDLE) SPECIAL CASE  ***
  4240. C
  4241.       IF (PHI .GT. ZERO) GO TO 310
  4242.          IF (KA .GE. KALIM) GO TO 430
  4243.               TWOPSI = ALPHAK*DST*DST - DOTPRD(P, STEP, G)
  4244.               IF (ALPHAK .GE. TWOPSI*PSIFAC) GO TO 310
  4245.                    V(STPPAR) = -ALPHAK
  4246.                    GO TO 440
  4247. C
  4248. C  ***  UNACCEPTABLE STEP -- UPDATE LK, UK, ALPHAK, AND TRY AGAIN  ***
  4249. C
  4250.  300  IF (PHI .LT. ZERO) UK = AMIN1(UK, ALPHAK)
  4251.       GO TO 320
  4252.  310  IF (PHI .LT. ZERO) UK = ALPHAK
  4253.  320  DO 330 I = 1, P
  4254.          J1 = IPIVOT(I)
  4255.          K = RES0 + I
  4256.          STEP(I) = D(J1) * (W(K)/DST)
  4257.  330     CONTINUE
  4258.       CALL LIVMUL(P, STEP, W(RMAT), STEP)
  4259.       DO 340 I = 1, P
  4260.  340     STEP(I) = STEP(I) / SQRT(W(I))
  4261.       T = ONE / V2NORM(P, STEP)
  4262.       ALPHAK = ALPHAK + T*PHI*T/RAD
  4263.       LK = AMAX1(LK, ALPHAK)
  4264.       GO TO 110
  4265. C
  4266. C  ***  RESTART  ***
  4267. C
  4268.  370  LK = W(LK0)
  4269.       UK = W(UK0)
  4270.       IF (V(DST0) .GT. ZERO .AND. V(DST0) - RAD .LE. PHIMAX) GO TO 20
  4271.       ALPHAK = ABS(V(STPPAR))
  4272.       DST = W(DSTSAV)
  4273.       PHI = DST - RAD
  4274.       T = V(DGNORM)/RAD
  4275.       IF (RAD .GT. V(RAD0)) GO TO 380
  4276. C
  4277. C        ***  SMALLER RADIUS  ***
  4278.          UK = T
  4279.          IF (ALPHAK .LE. ZERO) LK = ZERO
  4280.          IF (V(DST0) .GT. ZERO) LK = AMAX1(LK, (V(DST0)-RAD)*W(PHIPIN))
  4281.          GO TO 300
  4282. C
  4283. C     ***  BIGGER RADIUS  ***
  4284.  380  IF (ALPHAK .LE. ZERO .OR. UK .GT. T) UK = T
  4285.       LK = ZERO
  4286.       IF (V(DST0) .GT. ZERO) LK = AMAX1(LK, (V(DST0)-RAD)*W(PHIPIN))
  4287.       GO TO 300
  4288. C
  4289. C  ***  SPECIAL CASE -- RAD .LE. 0 OR (G = 0 AND J IS SINGULAR)  ***
  4290. C
  4291.  390  V(STPPAR) = ZERO
  4292.       DST = ZERO
  4293.       LK = ZERO
  4294.       UK = ZERO
  4295.       V(GTSTEP) = ZERO
  4296.       V(PREDUC) = ZERO
  4297.       DO 400 I = 1, P
  4298.  400     STEP(I) = ZERO
  4299.       GO TO 450
  4300. C
  4301. C  ***  ACCEPTABLE GAUSS-NEWTON STEP -- RECOVER STEP FROM W  ***
  4302. C
  4303.  410  ALPHAK = ZERO
  4304.       DO 420 I = 1, P
  4305.          J1 = IPIVOT(I)
  4306.          STEP(J1) = -W(I)
  4307.  420     CONTINUE
  4308. C
  4309. C  ***  SAVE VALUES FOR USE IN A POSSIBLE RESTART  ***
  4310. C
  4311.  430  V(STPPAR) = ALPHAK
  4312.  440  V(GTSTEP) = DOTPRD(P, STEP, G)
  4313.       V(PREDUC) = HALF * (ALPHAK*DST*DST - V(GTSTEP))
  4314.  450  V(DSTNRM) = DST
  4315.       W(DSTSAV) = DST
  4316.       W(LK0) = LK
  4317.       W(UK0) = UK
  4318.       V(RAD0) = RAD
  4319. C
  4320.  999  RETURN
  4321. C
  4322. C  ***  LAST CARD OF LMSTEP FOLLOWS  ***
  4323.       END
  4324.       SUBROUTINE LSQRT(N1, N, L, A, IRC)                                LSQ00010
  4325. C
  4326. C  ***  COMPUTE ROWS N1 THROUGH N OF THE CHOLESKY FACTOR  L  OF
  4327. C  ***  A = L*(L**T),  WHERE  L  AND THE LOWER TRIANGLE OF  A  ARE BOTH
  4328. C  ***  STORED COMPACTLY BY ROWS (AND MAY OCCUPY THE SAME STORAGE).
  4329. C  ***  IRC = 0 MEANS ALL WENT WELL.  IRC = J MEANS THE LEADING
  4330. C  ***  PRINCIPAL  J X J  SUBMATRIX OF  A  IS NOT POSITIVE DEFINITE --
  4331. C  ***  AND  L(J*(J+1)/2)  CONTAINS THE (NONPOS.) REDUCED J-TH DIAGONAL.
  4332. C
  4333. C  ***  PARAMETERS  ***
  4334. C
  4335.       INTEGER N1, N, IRC
  4336.       REAL L(1), A(1)
  4337. C     DIMENSION L(N*(N+1)/2), A(N*(N+1)/2)
  4338. C
  4339. C  ***  LOCAL VARIABLES  ***
  4340. C
  4341.       INTEGER I, IJ, IK, IM1, I0, J, JK, JM1, J0, K
  4342.       REAL T, TD, ZERO
  4343. C
  4344. C  ***  INTRINSIC FUNCTIONS  ***
  4345. C/+
  4346.       REAL SQRT
  4347. C/
  4348. C/6
  4349.       DATA ZERO/0.E+0/
  4350. C/7
  4351. C     PARAMETER (ZERO=0.D+0)
  4352. C/
  4353. C
  4354. C  ***  BODY  ***
  4355. C
  4356.       I0 = N1 * (N1 - 1) / 2
  4357.       DO 50 I = N1, N
  4358.          TD = ZERO
  4359.          IF (I .EQ. 1) GO TO 40
  4360.          J0 = 0
  4361.          IM1 = I - 1
  4362.          DO 30 J = 1, IM1
  4363.               T = ZERO
  4364.               IF (J .EQ. 1) GO TO 20
  4365.               JM1 = J - 1
  4366.               DO 10 K = 1, JM1
  4367.                    IK = I0 + K
  4368.                    JK = J0 + K
  4369.                    T = T + L(IK)*L(JK)
  4370.  10                CONTINUE
  4371.  20           IJ = I0 + J
  4372.               J0 = J0 + J
  4373.               T = (A(IJ) - T) / L(J0)
  4374.               L(IJ) = T
  4375.               TD = TD + T*T
  4376.  30           CONTINUE
  4377.  40      I0 = I0 + I
  4378.          T = A(I0) - TD
  4379.          IF (T .LE. ZERO) GO TO 60
  4380.          L(I0) = SQRT(T)
  4381.  50      CONTINUE
  4382. C
  4383.       IRC = 0
  4384.       GO TO 999
  4385. C
  4386.  60   L(I0) = T
  4387.       IRC = I
  4388. C
  4389.  999  RETURN
  4390. C
  4391. C  ***  LAST CARD OF LSQRT  ***
  4392.       END
  4393.       REAL FUNCTION LSVMIN(P, L, X, Y)                                  LSV00010
  4394. C
  4395. C  ***  ESTIMATE SMALLEST SING. VALUE OF PACKED LOWER TRIANG. MATRIX L
  4396. C
  4397. C  ***  PARAMETER DECLARATIONS  ***
  4398. C
  4399.       INTEGER P
  4400.       REAL L(1), X(P), Y(P)
  4401. C     DIMENSION L(P*(P+1)/2)
  4402. C
  4403. C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  4404. C
  4405. C  ***  PURPOSE  ***
  4406. C
  4407. C     THIS FUNCTION RETURNS A GOOD OVER-ESTIMATE OF THE SMALLEST
  4408. C     SINGULAR VALUE OF THE PACKED LOWER TRIANGULAR MATRIX L.
  4409. C
  4410. C  ***  PARAMETER DESCRIPTION  ***
  4411. C
  4412. C  P (IN)  = THE ORDER OF L.  L IS A  P X P  LOWER TRIANGULAR MATRIX.
  4413. C  L (IN)  = ARRAY HOLDING THE ELEMENTS OF  L  IN ROW ORDER, I.E.
  4414. C             L(1,1), L(2,1), L(2,2), L(3,1), L(3,2), L(3,3), ETC.
  4415. C  X (OUT) IF LSVMIN RETURNS A POSITIVE VALUE, THEN X IS A NORMALIZED
  4416. C             APPROXIMATE LEFT SINGULAR VECTOR CORRESPONDING TO THE
  4417. C             SMALLEST SINGULAR VALUE.  THIS APPROXIMATION MAY BE VERY
  4418. C             CRUDE.  IF LSVMIN RETURNS ZERO, THEN SOME COMPONENTS OF X
  4419. C             ARE ZERO AND THE REST RETAIN THEIR INPUT VALUES.
  4420. C  Y (OUT) IF LSVMIN RETURNS A POSITIVE VALUE, THEN Y = (L**-1)*X IS AN
  4421. C             UNNORMALIZED APPROXIMATE RIGHT SINGULAR VECTOR CORRESPOND-
  4422. C             ING TO THE SMALLEST SINGULAR VALUE.  THIS APPROXIMATION
  4423. C             MAY BE CRUDE.  IF LSVMIN RETURNS ZERO, THEN Y RETAINS ITS
  4424. C             INPUT VALUE.  THE CALLER MAY PASS THE SAME VECTOR FOR X
  4425. C             AND Y (NONSTANDARD FORTRAN USAGE), IN WHICH CASE Y OVER-
  4426. C             WRITES X (FOR NONZERO LSVMIN RETURNS).
  4427. C
  4428. C  ***  APPLICATION AND USAGE RESTRICTIONS  ***
  4429. C
  4430. C     THERE ARE NO USAGE RESTRICTIONS.
  4431. C
  4432. C  ***  ALGORITHM NOTES  ***
  4433. C
  4434. C     THE ALGORITHM IS BASED ON (1), WITH THE ADDITIONAL PROVISION THAT
  4435. C     LSVMIN = 0 IS RETURNED IF THE SMALLEST DIAGONAL ELEMENT OF L
  4436. C     (IN MAGNITUDE) IS NOT MORE THAN THE UNIT ROUNDOFF TIMES THE
  4437. C     LARGEST.  THE ALGORITHM USES A RANDOM NUMBER GENERATOR PROPOSED
  4438. C     IN (4), WHICH PASSES THE SPECTRAL TEST WITH FLYING COLORS -- SEE
  4439. C     (2) AND (3).
  4440. C
  4441. C  ***  SUBROUTINES AND FUNCTIONS CALLED  ***
  4442. C
  4443. C        V2NORM - FUNCTION, RETURNS THE 2-NORM OF A VECTOR.
  4444. C
  4445. C  ***  REFERENCES  ***
  4446. C
  4447. C     (1) CLINE, A., MOLER, C., STEWART, G., AND WILKINSON, J.H.(1977),
  4448. C         AN ESTIMATE FOR THE CONDITION NUMBER OF A MATRIX, REPORT
  4449. C         TM-310, APPLIED MATH. DIV., ARGONNE NATIONAL LABORATORY.
  4450. C
  4451. C     (2) HOAGLIN, D.C. (1976), THEORETICAL PROPERTIES OF CONGRUENTIAL
  4452. C         RANDOM-NUMBER GENERATORS --  AN EMPIRICAL VIEW,
  4453. C         MEMORANDUM NS-340, DEPT. OF STATISTICS, HARVARD UNIV.
  4454. C
  4455. C     (3) KNUTH, D.E. (1969), THE ART OF COMPUTER PROGRAMMING, VOL. 2
  4456. C         (SEMINUMERICAL ALGORITHMS), ADDISON-WESLEY, READING, MASS.
  4457. C
  4458. C     (4) SMITH, C.S. (1971), MULTIPLICATIVE PSEUDO-RANDOM NUMBER
  4459. C         GENERATORS WITH PRIME MODULUS, J. ASSOC. COMPUT. MACH. 18,
  4460. C         PP. 586-593.
  4461. C
  4462. C  ***  HISTORY  ***
  4463. C
  4464. C     DESIGNED AND CODED BY DAVID M. GAY (WINTER 1977/SUMMER 1978).
  4465. C
  4466. C  ***  GENERAL  ***
  4467. C
  4468. C     THIS SUBROUTINE WAS WRITTEN IN CONNECTION WITH RESEARCH
  4469. C     SUPPORTED BY THE NATIONAL SCIENCE FOUNDATION UNDER GRANTS
  4470. C     MCS-7600324, DCR75-10143, 76-14311DSS, AND MCS76-11989.
  4471. C
  4472. C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  4473. C
  4474. C  ***  LOCAL VARIABLES  ***
  4475. C
  4476.       INTEGER I, II, IX, J, JI, JJ, JJJ, JM1, J0, PPLUS1
  4477.       REAL B, PSJ, SMINUS, SPLUS, T, XMINUS, XPLUS
  4478. C
  4479. C  ***  CONSTANTS  ***
  4480. C
  4481.       REAL HALF, ONE, R9973, ZERO
  4482. C
  4483. C  ***  INTRINSIC FUNCTIONS  ***
  4484. C/+
  4485.       INTEGER MOD
  4486.       REAL ABS, FLOAT
  4487. C/
  4488. C  ***  EXTERNAL FUNCTIONS AND SUBROUTINES  ***
  4489. C
  4490.       EXTERNAL V2NORM
  4491.       REAL V2NORM
  4492. C
  4493. C/6
  4494.       DATA HALF/0.5E+0/, ONE/1.E+0/, R9973/9973.E+0/, ZERO/0.E+0/
  4495. C/7
  4496. C     PARAMETER (HALF=0.5D+0, ONE=1.D+0, R9973=9973.D+0, ZERO=0.D+0)
  4497. C     SAVE IX
  4498. C/
  4499.       DATA IX/2/
  4500. C
  4501. C  ***  BODY  ***
  4502. C
  4503. C  ***  FIRST CHECK WHETHER TO RETURN LSVMIN = 0 AND INITIALIZE X  ***
  4504. C
  4505.       II = 0
  4506.       DO 10 I = 1, P
  4507.          X(I) = ZERO
  4508.          II = II + I
  4509.          IF (L(II) .EQ. ZERO) GO TO 300
  4510.  10      CONTINUE
  4511.       IF (MOD(IX, 9973) .EQ. 0) IX = 2
  4512.       PPLUS1 = P + 1
  4513. C
  4514. C  ***  SOLVE (L**T)*X = B, WHERE THE COMPONENTS OF B HAVE RANDOMLY
  4515. C  ***  CHOSEN MAGNITUDES IN (.5,1) WITH SIGNS CHOSEN TO MAKE X LARGE.
  4516. C
  4517. C     DO J = P TO 1 BY -1...
  4518.       DO 100 JJJ = 1, P
  4519.          J = PPLUS1 - JJJ
  4520. C       ***  DETERMINE X(J) IN THIS ITERATION. NOTE FOR I = 1,2,...,J
  4521. C       ***  THAT X(I) HOLDS THE CURRENT PARTIAL SUM FOR ROW I.
  4522.          IX = MOD(3432*IX, 9973)
  4523.          B = HALF*(ONE + FLOAT(IX)/R9973)
  4524.          XPLUS = (B - X(J))
  4525.          XMINUS = (-B - X(J))
  4526.          SPLUS = ABS(XPLUS)
  4527.          SMINUS = ABS(XMINUS)
  4528.          JM1 = J - 1
  4529.          J0 = J*JM1/2
  4530.          JJ = J0 + J
  4531.          XPLUS = XPLUS/L(JJ)
  4532.          XMINUS = XMINUS/L(JJ)
  4533.          IF (JM1 .EQ. 0) GO TO 30
  4534.          DO 20 I = 1, JM1
  4535.               JI = J0 + I
  4536.               SPLUS = SPLUS + ABS(X(I) + L(JI)*XPLUS)
  4537.               SMINUS = SMINUS + ABS(X(I) + L(JI)*XMINUS)
  4538.  20           CONTINUE
  4539.  30      IF (SMINUS .GT. SPLUS) XPLUS = XMINUS
  4540.          X(J) = XPLUS
  4541. C       ***  UPDATE PARTIAL SUMS  ***
  4542.          IF (JM1 .EQ. 0) GO TO 100
  4543.          DO 40 I = 1, JM1
  4544.               JI = J0 + I
  4545.               X(I) = X(I) + L(JI)*XPLUS
  4546.  40           CONTINUE
  4547.  100     CONTINUE
  4548. C
  4549. C  ***  NORMALIZE X  ***
  4550. C
  4551.       T = ONE/V2NORM(P, X)
  4552.       DO 110 I = 1, P
  4553.  110     X(I) = T*X(I)
  4554. C
  4555. C  ***  SOLVE L*Y = X AND RETURN SVMIN = 1/TWONORM(Y)  ***
  4556. C
  4557.       DO 200 J = 1, P
  4558.          PSJ = ZERO
  4559.          JM1 = J - 1
  4560.          J0 = J*JM1/2
  4561.          IF (JM1 .EQ. 0) GO TO 130
  4562.          DO 120 I = 1, JM1
  4563.               JI = J0 + I
  4564.               PSJ = PSJ + L(JI)*Y(I)
  4565.  120          CONTINUE
  4566.  130     JJ = J0 + J
  4567.          Y(J) = (X(J) - PSJ)/L(JJ)
  4568.  200     CONTINUE
  4569. C
  4570.       LSVMIN = ONE/V2NORM(P, Y)
  4571.       GO TO 999
  4572. C
  4573.  300  LSVMIN = ZERO
  4574.  999  RETURN
  4575. C  ***  LAST CARD OF LSVMIN FOLLOWS  ***
  4576.       END
  4577.       SUBROUTINE LTSQAR(N, A, L)                                        LTS00010
  4578. C
  4579. C  ***  SET A TO LOWER TRIANGLE OF (L**T) * L  ***
  4580. C
  4581. C  ***  L = N X N LOWER TRIANG. MATRIX STORED ROWWISE.  ***
  4582. C  ***  A IS ALSO STORED ROWWISE AND MAY SHARE STORAGE WITH L.  ***
  4583. C
  4584.       INTEGER N
  4585.       REAL A(1), L(1)
  4586. C     DIMENSION A(N*(N+1)/2), L(N*(N+1)/2)
  4587. C
  4588.       INTEGER I, II, IIM1, I1, J, K, M
  4589.       REAL LII, LJ
  4590. C
  4591.       II = 0
  4592.       DO 50 I = 1, N
  4593.          I1 = II + 1
  4594.          II = II + I
  4595.          M = 1
  4596.          IF (I .EQ. 1) GO TO 30
  4597.          IIM1 = II - 1
  4598.          DO 20 J = I1, IIM1
  4599.               LJ = L(J)
  4600.               DO 10 K = I1, J
  4601.                    A(M) = A(M) + LJ*L(K)
  4602.                    M = M + 1
  4603.  10                CONTINUE
  4604.  20           CONTINUE
  4605.  30      LII = L(II)
  4606.          DO 40 J = I1, II
  4607.  40           A(J) = LII * L(J)
  4608.  50      CONTINUE
  4609. C
  4610.  999  RETURN
  4611. C  ***  LAST CARD OF LTSQAR FOLLOWS  ***
  4612.       END
  4613.       SUBROUTINE PARCHK(IV, N, NN, P, V)                                PAR00010
  4614. C
  4615. C  ***  CHECK NL2SOL (VERSION 2.2) PARAMETERS, PRINT CHANGED VALUES  ***
  4616. C
  4617.       INTEGER IV(1), N, NN, P
  4618.       REAL V(1)
  4619. C     DIMENSION IV(*), V(*)
  4620. C
  4621.       EXTERNAL DFAULT, RMDCON, VCOPY
  4622.       REAL RMDCON
  4623. C DFAULT -- SUPPLIES DFAULT PARAMETER VALUES.
  4624. C RMDCON -- RETURNS MACHINE-DEPENDENT CONSTANTS.
  4625. C VCOPY  -- COPIES ONE VECTOR TO ANOTHER.
  4626. C
  4627. C  ***  LOCAL VARIABLES  ***
  4628. C
  4629.       INTEGER I, IV1, JTOLP, K, L, M, NVDFLT, PU
  4630. C/6
  4631.       REAL CNGD(3), DFLT(3), VN(2,27), WHICH(3)
  4632. C/7
  4633. C     CHARACTER*4 CNGD(3), DFLT(3), VN(2,27), WHICH(3)
  4634. C/
  4635.       REAL BIG, MACHEP, TINY, VK, VM(27), VX(27), ZERO
  4636. C
  4637. C  ***  IV AND V SUBSCRIPTS  ***
  4638. C
  4639.       INTEGER DTYPE, DTYPE0, D0INIT, EPSLON, INITS, JTINIT, JTOL0,
  4640.      1        JTOL1, OLDN, OLDNN, OLDP, PARPRT, PARSV1, PRUNIT
  4641. C
  4642. C/6
  4643.       DATA NVDFLT/27/, ZERO/0.E+0/
  4644. C/7
  4645. C     PARAMETER (NVDFLT=27, ZERO=0.D+0)
  4646. C/
  4647. C
  4648. C/6
  4649.       DATA DTYPE/16/, DTYPE0/29/, D0INIT/37/, EPSLON/19/,
  4650.      1     INITS/25/, JTINIT/39/, JTOL0/86/, JTOL1/87/,
  4651.      2     OLDN/45/, OLDNN/46/, OLDP/47/, PARPRT/20/,
  4652.      3     PARSV1/51/, PRUNIT/21/
  4653. C/7
  4654. C     PARAMETER (DTYPE=16, DTYPE0=29, D0INIT=37, EPSLON=19,
  4655. C    1     INITS=25, JTINIT=39, JTOL0=86, JTOL1=87,
  4656. C    2     OLDN=45, OLDNN=46, OLDP=47, PARPRT=20,
  4657. C    3     PARSV1=51, PRUNIT=21)
  4658. C     SAVE BIG, TINY
  4659. C/
  4660. C
  4661.       DATA BIG/0.E+0/, TINY/1.E+0/
  4662. C/6
  4663.       DATA VN(1,1),VN(2,1)/4HEPSL,4HON../
  4664.       DATA VN(1,2),VN(2,2)/4HPHMN,4HFC../
  4665.       DATA VN(1,3),VN(2,3)/4HPHMX,4HFC../
  4666.       DATA VN(1,4),VN(2,4)/4HDECF,4HAC../
  4667.       DATA VN(1,5),VN(2,5)/4HINCF,4HAC../
  4668.       DATA VN(1,6),VN(2,6)/4HRDFC,4HMN../
  4669.       DATA VN(1,7),VN(2,7)/4HRDFC,4HMX../
  4670.       DATA VN(1,8),VN(2,8)/4HTUNE,4HR1../
  4671.       DATA VN(1,9),VN(2,9)/4HTUNE,4HR2../
  4672.       DATA VN(1,10),VN(2,10)/4HTUNE,4HR3../
  4673.       DATA VN(1,11),VN(2,11)/4HTUNE,4HR4../
  4674.       DATA VN(1,12),VN(2,12)/4HTUNE,4HR5../
  4675.       DATA VN(1,13),VN(2,13)/4HAFCT,4HOL../
  4676.       DATA VN(1,14),VN(2,14)/4HRFCT,4HOL../
  4677.       DATA VN(1,15),VN(2,15)/4HXCTO,4HL.../
  4678.       DATA VN(1,16),VN(2,16)/4HXFTO,4HL.../
  4679.       DATA VN(1,17),VN(2,17)/4HLMAX,4H0.../
  4680.       DATA VN(1,18),VN(2,18)/4HDLTF,4HDJ../
  4681.       DATA VN(1,19),VN(2,19)/4HD0IN,4HIT../
  4682.       DATA VN(1,20),VN(2,20)/4HDINI,4HT.../
  4683.       DATA VN(1,21),VN(2,21)/4HJTIN,4HIT../
  4684.       DATA VN(1,22),VN(2,22)/4HDLTF,4HDC../
  4685.       DATA VN(1,23),VN(2,23)/4HDFAC,4H..../
  4686.       DATA VN(1,24),VN(2,24)/4HRLIM,4HIT../
  4687.       DATA VN(1,25),VN(2,25)/4HCOSM,4HIN../
  4688.       DATA VN(1,26),VN(2,26)/4HDELT,4HA0../
  4689.       DATA VN(1,27),VN(2,27)/4HFUZZ,4H..../
  4690. C/7
  4691. C     DATA VN(1,1),VN(2,1)/'EPSL','ON..'/
  4692. C     DATA VN(1,2),VN(2,2)/'PHMN','FC..'/
  4693. C     DATA VN(1,3),VN(2,3)/'PHMX','FC..'/
  4694. C     DATA VN(1,4),VN(2,4)/'DECF','AC..'/
  4695. C     DATA VN(1,5),VN(2,5)/'INCF','AC..'/
  4696. C     DATA VN(1,6),VN(2,6)/'RDFC','MN..'/
  4697. C     DATA VN(1,7),VN(2,7)/'RDFC','MX..'/
  4698. C     DATA VN(1,8),VN(2,8)/'TUNE','R1..'/
  4699. C     DATA VN(1,9),VN(2,9)/'TUNE','R2..'/
  4700. C     DATA VN(1,10),VN(2,10)/'TUNE','R3..'/
  4701. C     DATA VN(1,11),VN(2,11)/'TUNE','R4..'/
  4702. C     DATA VN(1,12),VN(2,12)/'TUNE','R5..'/
  4703. C     DATA VN(1,13),VN(2,13)/'AFCT','OL..'/
  4704. C     DATA VN(1,14),VN(2,14)/'RFCT','OL..'/
  4705. C     DATA VN(1,15),VN(2,15)/'XCTO','L...'/
  4706. C     DATA VN(1,16),VN(2,16)/'XFTO','L...'/
  4707. C     DATA VN(1,17),VN(2,17)/'LMAX','0...'/
  4708. C     DATA VN(1,18),VN(2,18)/'DLTF','DJ..'/
  4709. C     DATA VN(1,19),VN(2,19)/'D0IN','IT..'/
  4710. C     DATA VN(1,20),VN(2,20)/'DINI','T...'/
  4711. C     DATA VN(1,21),VN(2,21)/'JTIN','IT..'/
  4712. C     DATA VN(1,22),VN(2,22)/'DLTF','DC..'/
  4713. C     DATA VN(1,23),VN(2,23)/'DFAC','....'/
  4714. C     DATA VN(1,24),VN(2,24)/'RLIM','IT..'/
  4715. C     DATA VN(1,25),VN(2,25)/'COSM','IN..'/
  4716. C     DATA VN(1,26),VN(2,26)/'DELT','A0..'/
  4717. C     DATA VN(1,27),VN(2,27)/'FUZZ','....'/
  4718. C/
  4719. C
  4720.       DATA VM(1)/1.0E-3/, VM(2)/-0.99E+0/, VM(3)/1.0E-3/, VM(4)/1.0E-2/,
  4721.      1     VM(5)/1.2E+0/, VM(6)/1.E-2/, VM(7)/1.2E+0/, VM(8)/0.E+0/,
  4722.      2     VM(9)/0.E+0/, VM(10)/1.E-3/, VM(11)/-1.E+0/, VM(15)/0.E+0/,
  4723.      3     VM(16)/0.E+0/, VM(19)/0.E+0/, VM(20)/-10.E+0/, VM(21)/0.E+0/,
  4724.      4     VM(23)/0.E+0/, VM(24)/1.E+10/, VM(27)/1.01E+0/
  4725.       DATA VX(1)/0.9E+0/, VX(2)/-1.E-3/, VX(3)/1.E+1/, VX(4)/0.8E+0/,
  4726.      1     VX(5)/1.E+2/, VX(6)/0.8E+0/, VX(7)/1.E+2/, VX(8)/0.5E+0/,
  4727.      2     VX(9)/0.5E+0/, VX(10)/1.E+0/, VX(11)/1.E+0/, VX(14)/0.1E+0/,
  4728.      3     VX(15)/1.E+0/, VX(16)/1.E+0/, VX(18)/1.E+0/, VX(22)/1.E+0/,
  4729.      4     VX(23)/1.E+0/, VX(25)/1.E+0/, VX(26)/1.E+0/, VX(27)/1.E+2/
  4730. C
  4731. C/6
  4732.       DATA CNGD(1),CNGD(2),CNGD(3)/4H---C,4HHANG,4HED V/,
  4733.      1     DFLT(1),DFLT(2),DFLT(3)/4HNOND,4HEFAU,4HLT V/
  4734. C/7
  4735. C     DATA CNGD(1),CNGD(2),CNGD(3)/'---C','HANG','ED V'/,
  4736. C    1     DFLT(1),DFLT(2),DFLT(3)/'NOND','EFAU','LT V'/
  4737. C/
  4738. C
  4739. C.......................................................................
  4740. C
  4741.       IF (IV(1) .EQ. 0) CALL DFAULT(IV, V)
  4742.       PU = IV(PRUNIT)
  4743.       IV1 = IV(1)
  4744.       IF (IV1 .NE. 12) GO TO 30
  4745.          IF (NN .GE. N .AND. N .GE. P .AND. P .GE. 1) GO TO 20
  4746.               IV(1) = 16
  4747.               IF (PU .NE. 0) WRITE(PU,10) NN, N, P
  4748.  10           FORMAT(30H0///// BAD NN, N, OR P... NN =,I5,5H, N =,I5,
  4749.      1               5H, P =,I5)
  4750.               GO TO 999
  4751.  20      K = IV(21)
  4752.          CALL DFAULT(IV(21), V(33))
  4753.          IV(21) = K
  4754.          IV(DTYPE0) = IV(DTYPE+20)
  4755.          IV(OLDN) = N
  4756.          IV(OLDNN) = NN
  4757.          IV(OLDP) = P
  4758.          WHICH(1) = DFLT(1)
  4759.          WHICH(2) = DFLT(2)
  4760.          WHICH(3) = DFLT(3)
  4761.          GO TO 80
  4762.  30   IF (N .EQ. IV(OLDN) .AND. NN .EQ. IV(OLDNN) .AND. P .EQ. IV(OLDP))
  4763.      1                       GO TO 50
  4764.          IV(1) = 17
  4765.          IF (PU .NE. 0) WRITE(PU,40) IV(OLDNN), IV(OLDN), IV(OLDP), NN,
  4766.      1                               N, P
  4767.  40      FORMAT(30H0///// (NN,N,P) CHANGED FROM (,I5,1H,,I5,1H,,I3,
  4768.      1          6H) TO (,I5,1H,,I5,1H,,I3,2H).)
  4769.          GO TO 999
  4770. C
  4771.  50   IF (IV1 .LE. 11 .AND. IV1 .GE. 1) GO TO 70
  4772.          IV(1) = 50
  4773.          IF (PU .NE. 0) WRITE(PU,60) IV1
  4774.  60      FORMAT(15H0/////  IV(1) =,I5,28H SHOULD BE BETWEEN 0 AND 12.)
  4775.          GO TO 999
  4776. C
  4777.  70   WHICH(1) = CNGD(1)
  4778.       WHICH(2) = CNGD(2)
  4779.       WHICH(3) = CNGD(3)
  4780. C
  4781.  80   IF (BIG .GT. TINY) GO TO 90
  4782.          TINY = RMDCON(1)
  4783.          MACHEP = RMDCON(3)
  4784.          BIG = RMDCON(6)
  4785.          VM(12) = MACHEP
  4786.          VX(12) = BIG
  4787.          VM(13) = TINY
  4788.          VX(13) = BIG
  4789.          VM(14) = MACHEP
  4790.          VM(17) = TINY
  4791.          VX(17) = BIG
  4792.          VM(18) = MACHEP
  4793.          VX(19) = BIG
  4794.          VX(20) = BIG
  4795.          VX(21) = BIG
  4796.          VM(22) = MACHEP
  4797.          VX(24) = RMDCON(5)
  4798.          VM(25) = MACHEP
  4799.          VM(26) = MACHEP
  4800.  90   M = 0
  4801.       IF (IV(INITS) .GE. 0 .AND. IV(INITS) .LE. 2) GO TO 110
  4802.          M = 18
  4803.          IF (PU .NE. 0) WRITE(PU,100) IV(INITS)
  4804.  100     FORMAT(25H0/////  INITS... IV(25) =,I4,20H SHOULD BE BETWEEN 0,
  4805.      1          7H AND 2.)
  4806.  110  K = EPSLON
  4807.       DO 140 I = 1, NVDFLT
  4808.          VK = V(K)
  4809.          IF (VK .GE. VM(I) .AND. VK .LE. VX(I)) GO TO 130
  4810.               M = K
  4811.               IF (PU .NE. 0) WRITE(PU,120) VN(1,I), VN(2,I), K, VK,
  4812.      1                                    VM(I), VX(I)
  4813.  120          FORMAT(8H0/////  ,2A4,5H.. V(,I2,3H) =,E11.3,7H SHOULD,
  4814.      1               11H BE BETWEEN,E11.3,4H AND,D11.3)
  4815.  130     K = K + 1
  4816.  140     CONTINUE
  4817. C
  4818.       IF (IV1 .EQ. 12 .AND. V(JTINIT) .GT. ZERO) GO TO 170
  4819. C
  4820. C  ***  CHECK JTOL VALUES  ***
  4821. C
  4822.       JTOLP = JTOL0 + P
  4823.       DO 160 I = JTOL1, JTOLP
  4824.          IF (V(I) .GT. ZERO) GO TO 160
  4825.          K = I - JTOL0
  4826.          IF (PU .NE. 0) WRITE(PU,150) K, I, V(I)
  4827.  150     FORMAT(12H0///// JTOL(,I3,6H) = V(,I3,3H) =,E11.3,
  4828.      1          20H SHOULD BE POSITIVE.)
  4829.          M = I
  4830.  160     CONTINUE
  4831. C
  4832.  170  IF (M .EQ. 0) GO TO 180
  4833.          IV(1) = M
  4834.          GO TO 999
  4835. C
  4836.  180  IF (PU .EQ. 0 .OR. IV(PARPRT) .EQ. 0) GO TO 999
  4837.       IF (IV1 .NE. 12 .OR. IV(INITS) .EQ. 0) GO TO 200
  4838.          M = 1
  4839.          WRITE(PU,190) IV(INITS)
  4840.  190     FORMAT(22H0NONDEFAULT VALUES..../20H INITS..... IV(25) =,I3)
  4841.  200  IF (IV(DTYPE) .EQ. IV(DTYPE0)) GO TO  210
  4842.          IF (M .EQ. 0) WRITE(PU,215) WHICH
  4843.          M = 1
  4844.          WRITE(PU,205) IV(DTYPE)
  4845.  205     FORMAT(20H DTYPE..... IV(16) =,I3)
  4846.  210  K = EPSLON
  4847.       L = PARSV1
  4848.       DO 240 I = 1, NVDFLT
  4849.          IF (V(K) .EQ. V(L)) GO TO 230
  4850.               IF (M .EQ. 0) WRITE(PU,215) WHICH
  4851.  215          FORMAT(1H0,3A4,9HALUES..../)
  4852.               M = 1
  4853.               WRITE(PU,220) VN(1,I), VN(2,I), K, V(K)
  4854.  220          FORMAT(1X,2A4,5H.. V(,I2,3H) =,E15.7)
  4855.  230     K = K + 1
  4856.          L = L + 1
  4857.  240     CONTINUE
  4858.       IV(DTYPE0) = IV(DTYPE)
  4859.       CALL VCOPY(NVDFLT, V(PARSV1), V(EPSLON))
  4860.       IF (IV1 .NE. 12) GO TO 999
  4861.          IF (V(JTINIT) .GT. ZERO) GO TO 260
  4862.               JTOLP = JTOL0 + P
  4863.               WRITE(PU,250) (V(I), I = JTOL1, JTOLP)
  4864.  250          FORMAT(24H0(INITIAL) JTOL ARRAY.../(1X,6E12.3))
  4865.  260     IF (V(D0INIT) .GT. ZERO) GO TO 999
  4866.               K = JTOL1 + P
  4867.               L = K + P - 1
  4868.               WRITE(PU,270) (V(I), I = K, L)
  4869.  270          FORMAT(22H0(INITIAL) D0 ARRAY.../1X,6E12.3)
  4870. C
  4871.  999  RETURN
  4872. C  ***  LAST CARD OF PARCHK FOLLOWS  ***
  4873.       END
  4874.       SUBROUTINE QAPPLY(NN, N, P, J, R, IERR)                           QAP00010
  4875. C     *****PARAMETERS.
  4876.       INTEGER NN, N, P, IERR
  4877.       REAL J(NN,P), R(N)
  4878. C
  4879. C     ..................................................................
  4880. C     ..................................................................
  4881. C
  4882. C     *****PURPOSE.
  4883. C     THIS SUBROUTINE APPLIES TO R THE ORTHOGONAL TRANSFORMATIONS
  4884. C     STORED IN J BY QRFACT
  4885. C
  4886. C     *****PARAMETER DESCRIPTION.
  4887. C     ON INPUT.
  4888. C
  4889. C        NN IS THE ROW DIMENSION OF THE MATRIX J AS DECLARED IN
  4890. C             THE CALLING PROGRAM DIMENSION STATEMENT
  4891. C
  4892. C        N IS THE NUMBER OF ROWS OF J AND THE SIZE OF THE VECTOR R
  4893. C
  4894. C        P IS THE NUMBER OF COLUMNS OF J AND THE SIZE OF SIGMA
  4895. C
  4896. C        J CONTAINS ON AND BELOW ITS DIAGONAL THE COLUMN VECTORS
  4897. C             U WHICH DETERMINE THE HOUSEHOLDER TRANSFORMATIONS
  4898. C             IDENT - U*U.TRANSPOSE
  4899. C
  4900. C        R IS THE RIGHT HAND SIDE VECTOR TO WHICH THE ORTHOGONAL
  4901. C             TRANSFORMATIONS WILL BE APPLIED
  4902. C
  4903. C        IERR IF NON-ZERO INDICATES THAT NOT ALL THE TRANSFORMATIONS
  4904. C             WERE SUCCESSFULLY DETERMINED AND ONLY THE FIRST
  4905. C             ABS(IERR) - 1 TRANSFORMATIONS WILL BE USED
  4906. C
  4907. C     ON OUTPUT.
  4908. C
  4909. C        R HAS BEEN OVERWRITTEN BY ITS TRANSFORMED IMAGE
  4910. C
  4911. C     *****APPLICATION AND USAGE RESTRICTIONS.
  4912. C     NONE
  4913. C
  4914. C     *****ALGORITHM NOTES.
  4915. C     THE VECTORS U WHICH DETERMINE THE HOUSEHOLDER TRANSFORMATIONS
  4916. C     ARE NORMALIZED SO THAT THEIR 2-NORM SQUARED IS 2.  THE USE OF
  4917. C     THESE TRANSFORMATIONS HERE IS IN THE SPIRIT OF (1).
  4918. C
  4919. C     *****SUBROUTINES AND FUNCTIONS CALLED.
  4920. C
  4921. C     DOTPRD - FUNCTION, RETURNS THE INNER PRODUCT OF VECTORS
  4922. C
  4923. C     *****REFERENCES.
  4924. C     (1) BUSINGER, P. A., AND GOLUB, G. H. (1965), LINEAR LEAST SQUARES
  4925. C        SOLUTIONS BY HOUSEHOLDER TRANSFORMATIONS, NUMER. MATH. 7,
  4926. C        PP. 269-276.
  4927. C
  4928. C     *****HISTORY.
  4929. C     DESIGNED BY DAVID M. GAY, CODED BY STEPHEN C. PETERS (WINTER 1977)
  4930. C
  4931. C     *****GENERAL.
  4932. C
  4933. C     THIS SUBROUTINE WAS WRITTEN IN CONNECTION WITH RESEARCH
  4934. C     SUPPORTED BY THE NATIONAL SCIENCE FOUNDATION UNDER GRANTS
  4935. C     MCS-7600324, DCR75-10143, 76-14311DSS, AND MCS76-11989.
  4936. C
  4937. C     ..................................................................
  4938. C     ..................................................................
  4939. C
  4940. C     *****LOCAL VARIABLES.
  4941.       INTEGER I, K, L, NL1
  4942.       REAL T
  4943. C     *****INTRINSIC FUNCTIONS.
  4944. C/+
  4945.       INTEGER IABS
  4946. C/
  4947. C     *****FUNCTIONS.
  4948.       EXTERNAL DOTPRD
  4949.       REAL DOTPRD
  4950. C
  4951.       K = P
  4952.       IF (IERR .NE. 0) K = IABS(IERR) - 1
  4953.       IF ( K .EQ. 0) GO TO 999
  4954. C
  4955.       DO 20 L = 1, K
  4956.          NL1 = N - L + 1
  4957.          T = -DOTPRD(NL1, J(L,L), R(L))
  4958. C
  4959.          DO 10 I = L, N
  4960.  10           R(I) = R(I) + T*J(I,L)
  4961.  20   CONTINUE
  4962.  999  RETURN
  4963. C     .... LAST CARD OF QAPPLY .........................................
  4964.       END
  4965.       SUBROUTINE QRFACT(NM,M,N,QR,ALPHA,IPIVOT,IERR,NOPIVK,SUM)         QRF00010
  4966. C
  4967. C  ***  COMPUTE THE QR DECOMPOSITION OF THE MATRIX STORED IN QR  ***
  4968. C
  4969. C     *****PARAMETERS.
  4970.       INTEGER NM,M,N,IPIVOT(N),IERR,NOPIVK
  4971.       REAL              QR(NM,N),ALPHA(N),SUM(N)
  4972. C     *****LOCAL VARIABLES.
  4973.       INTEGER I,J,JBAR,K,K1,MINUM,MK1
  4974.       REAL              ALPHAK,BETA,QRKK,QRKMAX,SIGMA,TEMP,UFETA,RKTOL,
  4975.      1        RKTOL1,SUMJ
  4976. C     *****FUNCTIONS.
  4977. C/+
  4978.       INTEGER MIN0
  4979.       REAL              ABS,SQRT
  4980. C/
  4981.       EXTERNAL DOTPRD, RMDCON, VAXPY, VSCOPY, V2NORM
  4982.       REAL DOTPRD, RMDCON, V2NORM
  4983. C DOTPRD... RETURNS INNER PRODUCT OF TWO VECTORS.
  4984. C RMDCON... RETURNS MACHINE-DEPENDENT CONSTANTS.
  4985. C VAXPY... COMPUTES SCALAR TIMES ONE VECTOR PLUS ANOTHER.
  4986. C VSCOPY... SETS ALL ELEMENTS OF A VECTOR TO A SCALAR.
  4987. C V2NORM... RETURNS THE 2-NORM OF A VECTOR.
  4988. C
  4989. C     *****CONSTANTS.
  4990.       REAL ONE, P01, P99, ZERO
  4991. C/6
  4992.       DATA ONE/1.0E+0/, P01/0.01E+0/, P99/0.99E+0/, ZERO/0.0E+0/
  4993. C/7
  4994. C     PARAMETER (ONE=1.0D+0, P01=0.01D+0, P99=0.99D+0, ZERO=0.0D+0)
  4995. C     SAVE RKTOL, UFETA
  4996. C/
  4997. C
  4998. C
  4999. C     ..................................................................
  5000. C     ..................................................................
  5001. C
  5002. C
  5003. C     *****PURPOSE.
  5004. C
  5005. C     THIS SUBROUTINE DOES A QR-DECOMPOSITION ON THE M X N MATRIX QR,
  5006. C        WITH AN OPTIONALLY MODIFIED COLUMN PIVOTING, AND RETURNS THE
  5007. C        UPPER TRIANGULAR R-MATRIX, AS WELL AS THE ORTHOGONAL VECTORS
  5008. C        USED IN THE TRANSFORMATIONS.
  5009. C
  5010. C     *****PARAMETER DESCRIPTION.
  5011. C     ON INPUT.
  5012. C
  5013. C        NM MUST BE SET TO THE ROW DIMENSION OF THE TWO DIMENSIONAL
  5014. C             ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
  5015. C             DIMENSION STATEMENT.
  5016. C
  5017. C        M MUST BE SET TO THE NUMBER OF ROWS IN THE MATRIX.
  5018. C
  5019. C        N MUST BE SET TO THE NUMBER OF COLUMNS IN THE MATRIX.
  5020. C
  5021. C        QR CONTAINS THE REAL RECTANGULAR MATRIX TO BE DECOMPOSED.
  5022. C
  5023. C     NOPIVK IS USED TO CONTROL PIVOTTING.  COLUMNS 1 THROUGH
  5024. C        NOPIVK WILL REMAIN FIXED IN POSITION.
  5025. C
  5026. C        SUM IS USED FOR TEMPORARY STORAGE FOR THE SUBROUTINE.
  5027. C
  5028. C     ON OUTPUT.
  5029. C
  5030. C        QR CONTAINS THE NON-DIAGONAL ELEMENTS OF THE R-MATRIX
  5031. C             IN THE STRICT UPPER TRIANGLE. THE VECTORS U, WHICH
  5032. C             DEFINE THE HOUSEHOLDER TRANSFORMATIONS   I - U*U-TRANSP,
  5033. C             ARE IN THE COLUMNS OF THE LOWER TRIANGLE. THESE VECTORS U
  5034. C             ARE SCALED SO THAT THE SQUARE OF THEIR 2-NORM IS 2.0.
  5035. C
  5036. C        ALPHA CONTAINS THE DIAGONAL ELEMENTS OF THE R-MATRIX.
  5037. C
  5038. C        IPIVOT REFLECTS THE COLUMN PIVOTING PERFORMED ON THE INPUT
  5039. C             MATRIX TO ACCOMPLISH THE DECOMPOSITION. THE J-TH
  5040. C             ELEMENT OF IPIVOT GIVES THE COLUMN OF THE ORIGINAL
  5041. C             MATRIX WHICH WAS PIVOTED INTO COLUMN J DURING THE
  5042. C             DECOMPOSITION.
  5043. C
  5044. C        IERR IS SET TO.
  5045. C             0 FOR NORMAL RETURN,
  5046. C             K IF NO NON-ZERO PIVOT COULD BE FOUND FOR THE K-TH
  5047. C                  TRANSFORMATION, OR
  5048. C             -K FOR AN ERROR EXIT ON THE K-TH THANSFORMATION.
  5049. C             IF AN ERROR EXIT WAS TAKEN, THE FIRST (K - 1)
  5050. C             TRANSFORMATIONS ARE CORRECT.
  5051. C
  5052. C
  5053. C     *****APPLICATIONS AND USAGE RESTRICTIONS.
  5054. C     THIS MAY BE USED WHEN SOLVING LINEAR LEAST-SQUARES PROBLEMS --
  5055. C     SEE SUBROUTINE QR1 OF ROSEPACK.  IT IS CALLED FOR THIS PURPOSE
  5056. C     BY LLSQST IN THE NL2SOL (NONLINEAR LEAST-SQUARES) PACKAGE.
  5057. C
  5058. C     *****ALGORITHM NOTES.
  5059. C     THIS VERSION OF QRFACT TRIES TO ELIMINATE THE OCCURRENCE OF
  5060. C     UNDERFLOWS DURING THE ACCUMULATION OF INNER PRODUCTS.  RKTOL1
  5061. C     IS CHOSEN BELOW SO AS TO INSURE THAT DISCARDED TERMS HAVE NO
  5062. C     EFFECT ON THE COMPUTED TWO-NORMS.
  5063. C
  5064. C     ADAPTED FROM THE ALGOL ROUTINE SOLVE (1).
  5065. C
  5066. C     *****REFERENCES.
  5067. C     (1)     BUSINGER,P. AND GOLUB,G.H., LINEAR LEAST SQUARES
  5068. C     SOLUTIONS BY HOUSHOLDER TRANSFORMATIONS, IN WILKINSON,J.H.
  5069. C     AND REINSCH,C.(EDS.), HANDBOOK FOR AUTOMATIC COMPUTATION,
  5070. C     VOLUME II. LINEAR ALGEBRA, SPRINGER-VERLAG, 111-118 (1971).
  5071. C     PREPUBLISHED IN NUMER.MATH. 7, 269-276 (1965).
  5072. C
  5073. C     *****HISTORY.
  5074. C     THIS AMOUNTS TO THE SUBROUTINE QR1 OF ROSEPACK WITH RKTOL1 USED
  5075. C     IN PLACE OF RKTOL BELOW, WITH V2NORM USED TO INITIALIZE (AND
  5076. C     SOMETIMES UPDATE) THE SUM ARRAY, AND WITH CALLS ON DOTPRD AND
  5077. C     VAXPY IN PLACE OF SOME LOOPS.
  5078. C
  5079. C     *****GENERAL.
  5080. C
  5081. C     DEVELOPMENT OF THIS PROGRAM SUPPORTED IN PART BY
  5082. C     NATIONAL SCIENCE FOUNDATION GRANT GJ-1154X3 AND
  5083. C     NATIONAL SCIENCE FOUNDATION GRANT DCR75-08802
  5084. C     TO NATIONAL BUREAU OF ECONOMIC RESEARCH, INC.
  5085. C
  5086. C
  5087. C
  5088. C     ..................................................................
  5089. C     ..................................................................
  5090. C
  5091. C
  5092. C     ..........  UFETA IS THE SMALLEST POSITIVE FLOATING POINT NUMBER
  5093. C        S.T. UFETA AND -UFETA CAN BOTH BE REPRESENTED.
  5094. C
  5095. C     ..........  RKTOL IS THE SQUARE ROOT OF THE RELATIVE PRECISION
  5096. C        OF FLOATING POINT ARITHMETIC (MACHEP).
  5097.       DATA RKTOL/0.E+0/, UFETA/0.E+0/
  5098. C     *****BODY OF PROGRAM.
  5099.       IF (UFETA .GT. ZERO) GO TO 10
  5100.          UFETA = RMDCON(1)
  5101.          RKTOL = RMDCON(4)
  5102.    10 IERR = 0
  5103.       RKTOL1 = P01 * RKTOL
  5104. C
  5105.       DO 20 J=1,N
  5106.          SUM(J) = V2NORM(M, QR(1,J))
  5107.          IPIVOT(J) = J
  5108.    20 CONTINUE
  5109. C
  5110.       MINUM = MIN0(M,N)
  5111. C
  5112.       DO 120 K=1,MINUM
  5113.          MK1 = M - K + 1
  5114. C        ..........K-TH HOUSEHOLDER TRANSFORMATION..........
  5115.          SIGMA = ZERO
  5116.          JBAR = 0
  5117. C        ..........FIND LARGEST COLUMN SUM..........
  5118.       IF (K .LE. NOPIVK) GO TO 50
  5119.          DO 30 J=K,N
  5120.               IF (SIGMA .GE. SUM(J))  GO TO 30
  5121.               SIGMA = SUM(J)
  5122.               JBAR = J
  5123.    30    CONTINUE
  5124. C
  5125.          IF (JBAR .EQ. 0)  GO TO 220
  5126.          IF (JBAR .EQ. K)  GO TO 50
  5127. C        ..........COLUMN INTERCHANGE..........
  5128.          I = IPIVOT(K)
  5129.          IPIVOT(K) = IPIVOT(JBAR)
  5130.          IPIVOT(JBAR) = I
  5131.          SUM(JBAR) = SUM(K)
  5132.          SUM(K) = SIGMA
  5133. C
  5134.          DO 40 I=1,M
  5135.               SIGMA = QR(I,K)
  5136.               QR(I,K) = QR(I,JBAR)
  5137.               QR(I,JBAR) = SIGMA
  5138.    40    CONTINUE
  5139. C        ..........END OF COLUMN INTERCHANGE..........
  5140.    50    CONTINUE
  5141. C        ..........  SECOND INNER PRODUCT  ..........
  5142.          QRKMAX = ZERO
  5143. C
  5144.          DO 60 I=K,M
  5145.               IF (ABS( QR(I,K) ) .GT. QRKMAX)  QRKMAX = ABS( QR(I,K) )
  5146.    60    CONTINUE
  5147. C
  5148.          IF (QRKMAX .LT. UFETA)  GO TO 210
  5149.          ALPHAK = V2NORM(MK1, QR(K,K)) / QRKMAX
  5150.          SIGMA = ALPHAK**2
  5151. C
  5152. C        ..........  END SECOND INNER PRODUCT  ..........
  5153.          QRKK = QR(K,K)
  5154.          IF (QRKK .GE. ZERO)  ALPHAK = -ALPHAK
  5155.          ALPHA(K) = ALPHAK * QRKMAX
  5156.          BETA = QRKMAX * SQRT(SIGMA - (QRKK*ALPHAK/QRKMAX) )
  5157.          QR(K,K) = QRKK - ALPHA(K)
  5158.          DO 65 I=K,M
  5159.    65         QR(I,K) =  QR(I,K) / BETA
  5160.          K1 = K + 1
  5161.          IF (K1 .GT. N) GO TO 120
  5162. C
  5163.          DO 110 J = K1, N
  5164.               TEMP = -DOTPRD(MK1, QR(K,K), QR(K,J))
  5165. C
  5166. C             ***  SET QR(I,J) = QR(I,J) + TEMP*QR(I,K), I = K,...,M.
  5167. C
  5168.               CALL VAXPY(MK1, QR(K,J), TEMP, QR(K,K), QR(K,J))
  5169. C
  5170.               IF (K1 .GT. M) GO TO 110
  5171.               SUMJ = SUM(J)
  5172.               IF (SUMJ .LT. UFETA) GO TO 110
  5173.               TEMP = ABS(QR(K,J)/SUMJ)
  5174.               IF (TEMP .LT. RKTOL1) GO TO 110
  5175.               IF (TEMP .GE. P99) GO TO 90
  5176.                    SUM(J) = SUMJ * SQRT(ONE - TEMP**2)
  5177.                    GO TO 110
  5178.    90         SUM(J) = V2NORM(M-K, QR(K1,J))
  5179.   110    CONTINUE
  5180. C        ..........END OF K-TH HOUSEHOLDER TRANSFORMATION..........
  5181.   120 CONTINUE
  5182. C
  5183.       GO TO 999
  5184. C     ..........ERROR EXIT ON K-TH TRANSFORMATION..........
  5185.   210 IERR = -K
  5186.       GO TO 230
  5187. C     ..........NO NON-ZERO ACCEPTABLE PIVOT FOUND..........
  5188.   220 IERR = K
  5189.   230 DO 240 I = K, N
  5190.          ALPHA(I) = ZERO
  5191.          IF (I .GT. K) CALL VSCOPY(I-K, QR(K,I), ZERO)
  5192.  240     CONTINUE
  5193. C     ..........RETURN TO CALLER..........
  5194.   999 RETURN
  5195. C     ..........LAST CARD OF QRFACT..........
  5196.       END
  5197.       REAL FUNCTION RELDST(P, D, X, X0)                                 REL00010
  5198. C
  5199. C  ***  COMPUTE AND RETURN RELATIVE DIFFERENCE BETWEEN X AND X0  ***
  5200. C  ***  NL2SOL VERSION 2.2  ***
  5201. C
  5202.       INTEGER P
  5203.       REAL D(P), X(P), X0(P)
  5204. C/+
  5205.       REAL ABS
  5206. C/
  5207.       INTEGER I
  5208.       REAL EMAX, T, XMAX, ZERO
  5209. C/6
  5210.       DATA ZERO/0.E+0/
  5211. C/7
  5212. C     PARAMETER (ZERO=0.D+0)
  5213. C/
  5214. C
  5215.       EMAX = ZERO
  5216.       XMAX = ZERO
  5217.       DO 10 I = 1, P
  5218.          T = ABS(D(I) * (X(I) - X0(I)))
  5219.          IF (EMAX .LT. T) EMAX = T
  5220.          T = D(I) * (ABS(X(I)) + ABS(X0(I)))
  5221.          IF (XMAX .LT. T) XMAX = T
  5222.  10      CONTINUE
  5223.       RELDST = ZERO
  5224.       IF (XMAX .GT. ZERO) RELDST = EMAX / XMAX
  5225.  999  RETURN
  5226. C  ***  LAST CARD OF RELDST FOLLOWS  ***
  5227.       END
  5228.       SUBROUTINE RPTMUL(FUNC, IPIVOT, J, NN, P, RD, X, Y, Z)            RPT00010
  5229. C
  5230. C  ***  FUNC = 1... SET  Y = RMAT * (PERM**T) * X.
  5231. C  ***  FUNC = 2... SET  Y = PERM * (RMAT**T) * RMAT * (PERM**T) * X.
  5232. C  ***  FUNC = 3... SET  Y = PERM * (RMAT**T) X.
  5233. C
  5234. C
  5235. C  ***  PERM = MATRIX WHOSE I-TH COL. IS THE IPIVOT(I)-TH UNIT VECTOR.
  5236. C  ***  RMAT IS THE UPPER TRIANGULAR MATRIX WHOSE STRICT UPPER TRIANGLE
  5237. C  ***       IS STORED IN  J  AND WHOSE DIAGONAL IS STORED IN RD.
  5238. C  ***  Z IS A SCRATCH VECTOR.
  5239. C  ***  X AND Y MAY SHARE STORAGE.
  5240. C
  5241.       INTEGER FUNC, NN, P
  5242.       INTEGER IPIVOT(P)
  5243.       REAL J(NN,P), RD(P), X(P), Y(P), Z(P)
  5244. C
  5245. C  ***  LOCAL VARIABLES  ***
  5246. C
  5247.       INTEGER I, IM1, K, KM1
  5248.       REAL ZK
  5249. C
  5250. C  ***  EXTERNAL FUNCTION  ***
  5251. C
  5252.       EXTERNAL DOTPRD
  5253.       REAL DOTPRD
  5254. C
  5255. C-----------------------------------------------------------------------
  5256. C
  5257.       IF (FUNC .GT. 2) GO TO 50
  5258. C
  5259. C  ***  FIRST SET  Z = (PERM**T) * X  ***
  5260. C
  5261.       DO 10 I = 1, P
  5262.          K = IPIVOT(I)
  5263.          Z(I) = X(K)
  5264.  10      CONTINUE
  5265. C
  5266. C  ***  NOW SET  Y = RMAT * Z  ***
  5267. C
  5268.       Y(1) = Z(1) * RD(1)
  5269.       IF (P .LE. 1) GO TO 40
  5270.       DO 30 K = 2, P
  5271.          KM1 = K - 1
  5272.          ZK = Z(K)
  5273.          DO 20 I = 1, KM1
  5274.  20           Y(I) = Y(I) + J(I,K)*ZK
  5275.          Y(K) = ZK*RD(K)
  5276.  30      CONTINUE
  5277. C
  5278.  40   IF (FUNC .LE. 1) GO TO 999
  5279.       GO TO 70
  5280. C
  5281.  50   DO 60 I = 1, P
  5282.  60      Y(I) = X(I)
  5283. C
  5284. C  ***  SET  Z = (RMAT**T) * Y  ***
  5285. C
  5286.  70   Z(1) = Y(1) * RD(1)
  5287.       IF (P .EQ. 1) GO TO 90
  5288.       DO 80 I = 2, P
  5289.          IM1 = I - 1
  5290.          Z(I) = Y(I)*RD(I) + DOTPRD(IM1, J(1,I), Y)
  5291.  80      CONTINUE
  5292. C
  5293. C  ***  NOW SET  Y = PERM * Z  ***
  5294. C
  5295.  90   DO 100 I = 1, P
  5296.          K = IPIVOT(I)
  5297.          Y(K) = Z(I)
  5298.  100     CONTINUE
  5299. C
  5300.  999  RETURN
  5301. C  ***  LAST CARD OF RPTMUL FOLLOWS  ***
  5302.       END
  5303.       SUBROUTINE SLUPDT(A, COSMIN, P, SIZE, STEP, U, W, WCHMTD, WSCALE, SLU00010
  5304.      1                  Y)
  5305. C
  5306. C  ***  UPDATE SYMMETRIC  A  SO THAT  A * STEP = Y  ***
  5307. C  ***  (LOWER TRIANGLE OF  A  STORED ROWWISE       ***
  5308. C
  5309. C  ***  PARAMETER DECLARATIONS  ***
  5310. C
  5311.       INTEGER P
  5312.       REAL A(1), COSMIN, SIZE, STEP(P), U(P), W(P),
  5313.      1                 WCHMTD(P), WSCALE, Y(P)
  5314. C     DIMENSION A(P*(P+1)/2)
  5315. C
  5316. C  ***  LOCAL VARIABLES  ***
  5317. C
  5318.       INTEGER I, J, K
  5319.       REAL DENMIN, SDOTWM, T, UI, WI
  5320. C
  5321. C     ***  CONSTANTS  ***
  5322.       REAL HALF, ONE, ZERO
  5323. C
  5324. C  ***  INTRINSIC FUNCTIONS  ***
  5325. C/+
  5326.       REAL ABS, AMIN1
  5327. C/
  5328. C  ***  EXTERNAL FUNCTIONS AND SUBROUTINES  ***
  5329. C
  5330.       EXTERNAL DOTPRD, SLVMUL, V2NORM
  5331.       REAL DOTPRD, V2NORM
  5332. C
  5333. C/6
  5334.       DATA HALF/0.5E+0/, ONE/1.E+0/, ZERO/0.E+0/
  5335. C/7
  5336. C     PARAMETER (HALF=0.5D+0, ONE=1.D+0, ZERO=0.D+0)
  5337. C/
  5338. C
  5339. C-----------------------------------------------------------------------
  5340. C
  5341.       SDOTWM = DOTPRD(P, STEP, WCHMTD)
  5342.       DENMIN = COSMIN * V2NORM(P,STEP) * V2NORM(P,WCHMTD)
  5343.       WSCALE = ONE
  5344.       IF (DENMIN .NE. ZERO) WSCALE = AMIN1(ONE, ABS(SDOTWM/DENMIN))
  5345.       T = ZERO
  5346.       IF (SDOTWM .NE. ZERO) T = WSCALE / SDOTWM
  5347.       DO 10 I = 1, P
  5348.  10      W(I) = T * WCHMTD(I)
  5349.       CALL SLVMUL(P, U, A, STEP)
  5350.       T = HALF * (SIZE * DOTPRD(P, STEP, U)  -  DOTPRD(P, STEP, Y))
  5351.       DO 20 I = 1, P
  5352.  20      U(I) = T*W(I) + Y(I) - SIZE*U(I)
  5353. C
  5354. C  ***  SET  A = A + U*(W**T) + W*(U**T)  ***
  5355. C
  5356.       K = 1
  5357.       DO 40 I = 1, P
  5358.          UI = U(I)
  5359.          WI = W(I)
  5360.          DO 30 J = 1, I
  5361.               A(K) = SIZE*A(K) + UI*W(J) + WI*U(J)
  5362.               K = K + 1
  5363.  30           CONTINUE
  5364.  40      CONTINUE
  5365. C
  5366.  999  RETURN
  5367. C  ***  LAST CARD OF SLUPDT FOLLOWS  ***
  5368.       END
  5369.       SUBROUTINE SLVMUL(P, Y, S, X)                                     SLV00010
  5370. C
  5371. C  ***  SET  Y = S * X,  S = P X P SYMMETRIC MATRIX.  ***
  5372. C  ***  LOWER TRIANGLE OF  S  STORED ROWWISE.         ***
  5373. C
  5374. C  ***  PARAMETER DECLARATIONS  ***
  5375. C
  5376.       INTEGER P
  5377.       REAL S(1), X(P), Y(P)
  5378. C     DIMENSION S(P*(P+1)/2)
  5379. C
  5380. C  ***  LOCAL VARIABLES  ***
  5381. C
  5382.       INTEGER I, IM1, J, K
  5383.       REAL XI
  5384. C
  5385. C  ***  NO INTRINSIC FUNCTIONS  ***
  5386. C
  5387. C  ***  EXTERNAL FUNCTION  ***
  5388. C
  5389.       EXTERNAL DOTPRD
  5390.       REAL DOTPRD
  5391. C
  5392. C-----------------------------------------------------------------------
  5393. C
  5394.       J = 1
  5395.       DO 10 I = 1, P
  5396.          Y(I) = DOTPRD(I, S(J), X)
  5397.          J = J + I
  5398.  10      CONTINUE
  5399. C
  5400.       IF (P .LE. 1) GO TO 999
  5401.       J = 1
  5402.       DO 40 I = 2, P
  5403.          XI = X(I)
  5404.          IM1 = I - 1
  5405.          J = J + 1
  5406.          DO 30 K = 1, IM1
  5407.               Y(K) = Y(K) + S(J)*XI
  5408.               J = J + 1
  5409.  30           CONTINUE
  5410.  40      CONTINUE
  5411. C
  5412.  999  RETURN
  5413. C  ***  LAST CARD OF SLVMUL FOLLOWS  ***
  5414.       END
  5415.       LOGICAL FUNCTION STOPX(IDUMMY)                                    STO00010
  5416. C     *****PARAMETERS...
  5417.       INTEGER IDUMMY
  5418. C
  5419. C     ..................................................................
  5420. C
  5421. C     *****PURPOSE...
  5422. C     THIS FUNCTION MAY SERVE AS THE STOPX (ASYNCHRONOUS INTERRUPTION)
  5423. C     FUNCTION FOR THE NL2SOL (NONLINEAR LEAST-SQUARES) PACKAGE AT
  5424. C     THOSE INSTALLATIONS WHICH DO NOT WISH TO IMPLEMENT A
  5425. C     DYNAMIC STOPX.
  5426. C
  5427. C     *****ALGORITHM NOTES...
  5428. C     AT INSTALLATIONS WHERE THE NL2SOL SYSTEM IS USED
  5429. C     INTERACTIVELY, THIS DUMMY STOPX SHOULD BE REPLACED BY A
  5430. C     FUNCTION THAT RETURNS .TRUE. IF AND ONLY IF THE INTERRUPT
  5431. C     (BREAK) KEY HAS BEEN PRESSED SINCE THE LAST CALL ON STOPX.
  5432. C
  5433. C     ..................................................................
  5434. C
  5435.       STOPX = .FALSE.
  5436.       RETURN
  5437.       END
  5438.       SUBROUTINE VAXPY(P, W, A, X, Y)                                   VAX00010
  5439. C
  5440. C  ***  SET W = A*X + Y  --  W, X, Y = P-VECTORS, A = SCALAR  ***
  5441. C
  5442.       INTEGER P
  5443.       REAL A, W(P), X(P), Y(P)
  5444. C
  5445.       INTEGER I
  5446. C
  5447.       DO 10 I = 1, P
  5448.  10      W(I) = A*X(I) + Y(I)
  5449.       RETURN
  5450.       END
  5451.       SUBROUTINE VCOPY(P, Y, X)                                         VCO00010
  5452. C
  5453. C  ***  SET Y = X, WHERE X AND Y ARE P-VECTORS  ***
  5454. C
  5455.       INTEGER P
  5456.       REAL X(P), Y(P)
  5457. C
  5458.       INTEGER I
  5459. C
  5460.       DO 10 I = 1, P
  5461.  10      Y(I) = X(I)
  5462.       RETURN
  5463.       END
  5464.       SUBROUTINE VSCOPY(P, Y, S)                                        VSC00010
  5465. C
  5466. C  ***  SET P-VECTOR Y TO SCALAR S  ***
  5467. C
  5468.       INTEGER P
  5469.       REAL S, Y(P)
  5470. C
  5471.       INTEGER I
  5472. C
  5473.       DO 10 I = 1, P
  5474.  10      Y(I) = S
  5475.       RETURN
  5476.       END
  5477.       REAL FUNCTION V2NORM(P, X)                                        V2N00010
  5478. C
  5479. C  ***  RETURN THE 2-NORM OF THE P-VECTOR X, TAKING  ***
  5480. C  ***  CARE TO AVOID THE MOST LIKELY UNDERFLOWS.    ***
  5481. C
  5482.       INTEGER P
  5483.       REAL X(P)
  5484. C
  5485.       INTEGER I, J
  5486.       REAL ONE, R, SCALE, SQTETA, T, XI, ZERO
  5487. C/+
  5488.       REAL ABS, SQRT
  5489. C/
  5490.       EXTERNAL RMDCON
  5491.       REAL RMDCON
  5492. C
  5493. C/6
  5494.       DATA ONE/1.E+0/, ZERO/0.E+0/
  5495. C/7
  5496. C     PARAMETER (ONE=1.D+0, ZERO=0.D+0)
  5497. C     SAVE SQTETA
  5498. C/
  5499.       DATA SQTETA/0.E+0/
  5500. C
  5501.       IF (P .GT. 0) GO TO 10
  5502.          V2NORM = ZERO
  5503.          GO TO 999
  5504.  10   DO 20 I = 1, P
  5505.          IF (X(I) .NE. ZERO) GO TO 30
  5506.  20      CONTINUE
  5507.       V2NORM = ZERO
  5508.       GO TO 999
  5509. C
  5510.  30   SCALE = ABS(X(I))
  5511.       IF (I .LT. P) GO TO 40
  5512.          V2NORM = SCALE
  5513.          GO TO 999
  5514.  40   T = ONE
  5515.       IF (SQTETA .EQ. ZERO) SQTETA = RMDCON(2)
  5516. C
  5517. C     ***  SQTETA IS (SLIGHTLY LARGER THAN) THE SQUARE ROOT OF THE
  5518. C     ***  SMALLEST POSITIVE FLOATING POINT NUMBER ON THE MACHINE.
  5519. C     ***  THE TESTS INVOLVING SQTETA ARE DONE TO PREVENT UNDERFLOWS.
  5520. C
  5521.       J = I + 1
  5522.       DO 60 I = J, P
  5523.          XI = ABS(X(I))
  5524.          IF (XI .GT. SCALE) GO TO 50
  5525.               R = XI / SCALE
  5526.               IF (R .GT. SQTETA) T = T + R*R
  5527.               GO TO 60
  5528.  50           R = SCALE / XI
  5529.               IF (R .LE. SQTETA) R = ZERO
  5530.               T = ONE  +  T * R*R
  5531.          SCALE = XI
  5532.  60      CONTINUE
  5533. C
  5534.       V2NORM = SCALE * SQRT(T)
  5535.  999  RETURN
  5536. C  ***  LAST CARD OF V2NORM FOLLOWS  ***
  5537.       END
  5538. C///////////////////////////////////////////////////////////////////////
  5539. C  ***  RUN NL2SOL ON VARIOUS TEST PROBLEMS, PRINT SUMMARY STATISTICS.  NLM00010
  5540. C
  5541. C     *****COMMON STORAGE WITH NLTEST.
  5542. C
  5543.       COMMON /TESTCM/ V, RS, JAC, NOUT, NPROB, XSCAL1, XSCAL2, IS, IV
  5544.       COMMON /TESTCH/ NAME, IRC
  5545.       INTEGER IS(6,50), IV(80), JAC, NOUT, NPROB, XSCAL1, XSCAL2
  5546.       REAL RS(5,50)
  5547. C/6
  5548.       REAL NAME(2,50)
  5549.       INTEGER IRC(50)
  5550. C/7
  5551. C     CHARACTER NAME(2,50)*4, IRC(50)*1
  5552. C/
  5553.       REAL V(1736)
  5554. C
  5555. C
  5556. C     ..................................................................
  5557. C
  5558. C     *****PURPOSE.
  5559. C        THIS MAIN PROGRAM CALLS NLTEST TO RUN NL2SOL, THE NONLINEAR
  5560. C     LEAST-SQUARES SOLVER OF REF. 1, ON VARIOUS TEST PROBLEMS.
  5561. C
  5562. C
  5563. C     *****APPLICATION AND USAGE RESTRICTIONS.
  5564. C     THIS MAIN DRIVER IS INTENDED TO CHECK WHETHER THE NL2SOL
  5565. C     (NONLINEAR LEAST-SQUARES) PACKAGE WAS SUCCESSFULLY
  5566. C     TRANSPORTED TO A NEW MACHINE.
  5567. C
  5568. C     *****ALGORITHM NOTES.
  5569. C     THE TEST PROBLEMS USED ARE FROM REFERENCES (2), (3), AND (4).
  5570. C     SOME ADDITIONAL TEST PROBLEMS WERE SUGGESTED BY JORGE MORE (PRI-
  5571. C     VATE COMMUNICATION).  CALLS PASSING THESE PROBLEMS TO NLTEST HAVE
  5572. C     BEEN COMMENTED OUT (SINCE THERE ARE ENOUGH OTHER PROBLEMS), BUT
  5573. C     NOT REMOVED, SINCE THEY MAY BE OF INTEREST TO OTHER RESEARCHERS.
  5574. C
  5575. C     *****FUNCTIONS AND SUBROUTINES CALLED.
  5576. C
  5577. C        DFAULT - ESTABLISHES THE DEFAULT PARAMETER SETTINGS FOR
  5578. C                 IV AND V.
  5579. C
  5580. C        IMDCON - IMDCON(2) RETURNS I/O UNIT NUMBER ON WHICH NLTEST
  5581. C                  WRITES A SUMMARY OF EACH TEST RUN.
  5582. C
  5583. C        IVVSET - SUPPLIES NONDEFAULT VALUES FOR IV AND V.
  5584. C
  5585. C        NLTEST - CALLS NL2SOL, THE NONLINEAR LEAST-SQUARES
  5586. C                  PROBLEM SOLVER.
  5587. C
  5588. C        TODAY  - SUPPLIES DATE AND TIME (OR CURRENT VERSION OF NL2SOL).
  5589. C
  5590. C     *****REFERENCES.
  5591. C
  5592. C     (1). DENNIS, J.E.. GAY, D.M.. AND WELSCH, R.E. (1980),
  5593. C          AN ADAPTIVE NONLINEAR LEAST-SQUARES ALGORITHM,
  5594. C          SUBMITTED TO ACM TRANS. MATH. SOFTWARE.
  5595. C          UNDER REVISION.
  5596. C
  5597. C     (2). GILL, P.E.. AND MURRAY, W. (1976),ALGORITHMS FOR THE
  5598. C          SOLUTION OF THE NON-LINEAR LEAST-SQUARES PROBLEM,
  5599. C          NPL REPORT NAC71,(NATIONAL PHYSICAL LABORATORY,
  5600. C          DIVISION OF NUMERICAL ANALYSIS AND COMPUTING,
  5601. C          TEDDINGTON,MIDDLESEX,ENGLAND).
  5602. C
  5603. C     (3) MEYER, R.R. (1970), THEORETICAL AND COMPUTATIONAL ASPECTS
  5604. C        OF NONLINEAR REGRESSION, PP. 465-486 OF NONLINEAR PROGRAMMING,
  5605. C        EDITED BY J.B. ROSEN, O.L.MANGASARIAN, AND K. RITTER,
  5606. C        ACADEMIC PRESS, NEW YORK.
  5607. C
  5608. C     (4) BROWN, K.M. (1969), A QUADRATICALLY CONVERGENT NEWTON-
  5609. C        LIKE METHOD BASED UPON GAUSSIAN ELIMINATION,
  5610. C        SIAM J. NUMER. ANAL. 6, PP. 560-569.
  5611. C
  5612. C     *****GENERAL.
  5613. C
  5614. C     THIS SUBROUTINE WAS WRITTEN IN CONNECTION WITH RESEARCH
  5615. C     SUPPORTED BY THE NATIONAL SCIENCE FOUNDATION UNDER GRANTS
  5616. C     MCS-7600324, DCR75-10143, 76-14311DSS, AND MCS76-11989.
  5617. C
  5618. C     ..................................................................
  5619. C     ..................................................................
  5620. C
  5621. C     *****INTRINSIC FUNCTIONS.
  5622. C/+
  5623.       INTEGER MOD
  5624.       REAL AMAX1
  5625. C/
  5626. C     *****EXTERNAL FUNCTIONS AND SUBROUTINES.
  5627.       EXTERNAL DFAULT, IMDCON, IVVSET, NLTEST, TODAY
  5628.       INTEGER IMDCON
  5629. C
  5630. C     *****LOCAL VARIABLES.
  5631.       LOGICAL RSTART
  5632.       INTEGER I, J, K, MXFCSV, MXITSV, PU
  5633. C/6
  5634.       INTEGER JTYP(2)
  5635.       REAL DATIME(4)
  5636. C/7
  5637. C     CHARACTER DATIME(4)*4, JTYP(2)*1
  5638. C/
  5639. C
  5640. C/6
  5641.       DATA RSTART/.FALSE./, JTYP(1),JTYP(2)/1H ,1H*/
  5642. C/7
  5643. C     DATA RSTART/.FALSE./, JTYP(1),JTYP(2)/' ','*'/
  5644. C/
  5645. C
  5646. C-----------------------------------------------------------------------
  5647. C
  5648. C  ***  ESTABLISH DEFAULT PARAMETER SETTINGS  ***
  5649.       CALL DFAULT (IV, V)
  5650.       NOUT = IMDCON(2)
  5651. C
  5652. C  ***  NON-DEFAULT PARAMETER SETTINGS  ***
  5653. C
  5654.       CALL IVVSET(IV, V)
  5655.       PU = IV(21)
  5656. C
  5657.       JAC = 1
  5658.       NPROB = 0
  5659.       XSCAL1 = 1
  5660.       XSCAL2 = 3
  5661. C
  5662. C/6
  5663.       CALL NLTEST(2,2,1,4HROSN,4HBROK,RSTART)
  5664.       CALL NLTEST(3,3,2,4HHELI,4HX   ,RSTART)
  5665.       CALL NLTEST(4,4,3,4HSING,4HULAR,RSTART)
  5666.       CALL NLTEST(7,4,4,4HWOOD,4HS   ,RSTART)
  5667.       XSCAL2 = 1
  5668.       CALL NLTEST(3,3,5,4HZANG,4HWILL,RSTART)
  5669.       XSCAL2 = 3
  5670.       CALL NLTEST(5,3,6,4HENGV,4HALL ,RSTART)
  5671.       CALL NLTEST(2,2,7,4HBRAN,4HIN  ,RSTART)
  5672.       XSCAL2 = 2
  5673.       CALL NLTEST(3,2,8,4HBEAL,4HE   ,RSTART)
  5674.       CALL NLTEST(5,4,9,4HCRAG,4HG   ,RSTART)
  5675.       XSCAL2 = 2
  5676.       CALL NLTEST(10,3,10,4HBOX ,4H    ,RSTART)
  5677.       MXFCSV = IV(17)
  5678.       MXITSV = IV(18)
  5679.       IV(17) = 20
  5680.       IV(18) = 15
  5681.       XSCAL2 = 1
  5682.       CALL NLTEST(15,15,11,4HDAVI,4HDON1,RSTART)
  5683.       IV(17) = MXFCSV
  5684.       IV(18) = MXITSV
  5685.       XSCAL2 = 3
  5686.       CALL NLTEST(2,2,12,4HFRDS,4HTEIN,RSTART)
  5687.       XSCAL2 = 1
  5688.       CALL NLTEST(31,6,13,4HWATS,4HON6 ,RSTART)
  5689.       CALL NLTEST(31,9,14,4HWATS,4HON9 ,RSTART)
  5690.       CALL NLTEST(31,12,15,4HWATS,4HON12,RSTART)
  5691.       MXFCSV = IV(17)
  5692.       IV(17) = 20
  5693.       MXITSV = IV(18)
  5694.       IV(18) = 15
  5695.       CALL NLTEST(31,20,16,4HWATS,4HON20,RSTART)
  5696.       IV(17) = MXFCSV
  5697.       IV(18) = MXITSV
  5698.       XSCAL2 = 2
  5699.       CALL NLTEST(8,8,17,4HCHEB,4HQD8 ,RSTART)
  5700.       XSCAL2 = 3
  5701.       CALL NLTEST(20,4,18,4HBROW,4HN   ,RSTART)
  5702.       CALL NLTEST(15,3,19,4HBARD,4H    ,RSTART)
  5703.       XSCAL2 = 1
  5704.       CALL NLTEST(10,2,20,4HJENN,4HRICH,RSTART)
  5705.       XSCAL2 = 3
  5706.       CALL NLTEST(11,4,21,4HKOWA,4HLIK ,RSTART)
  5707.       XSCAL2 = 1
  5708.       CALL NLTEST(33,5,22,4HOSBO,4HRNE1,RSTART)
  5709.       XSCAL2 = 2
  5710.       CALL NLTEST(65,11,23,4HOSBO,4HRNE2,RSTART)
  5711.       XSCAL2 = 3
  5712.       CALL NLTEST(3,2,24,4HMADS,4HEN  ,RSTART)
  5713.       XSCAL2 = 1
  5714.       IV(17) = 400
  5715.       IV(18) = 300
  5716.       CALL NLTEST(16,3,25,4HMEYE,4HR   ,RSTART)
  5717. C/7
  5718. C     CALL NLTEST(2,2,1,'ROSN','BROK',RSTART)
  5719. C     CALL NLTEST(3,3,2,'HELI','X   ',RSTART)
  5720. C     CALL NLTEST(4,4,3,'SING','ULAR',RSTART)
  5721. C     CALL NLTEST(7,4,4,'WOOD','S   ',RSTART)
  5722. C     XSCAL2 = 1
  5723. C     CALL NLTEST(3,3,5,'ZANG','WILL',RSTART)
  5724. C     XSCAL2 = 3
  5725. C     CALL NLTEST(5,3,6,'ENGV','ALL ',RSTART)
  5726. C     CALL NLTEST(2,2,7,'BRAN','IN  ',RSTART)
  5727. C     XSCAL2 = 2
  5728. C     CALL NLTEST(3,2,8,'BEAL','E   ',RSTART)
  5729. C     CALL NLTEST(5,4,9,'CRAG','G   ',RSTART)
  5730. C     XSCAL2 = 2
  5731. C     CALL NLTEST(10,3,10,'BOX ','    ',RSTART)
  5732. C     MXFCSV = IV(17)
  5733. C     MXITSV = IV(18)
  5734. C     IV(17) = 20
  5735. C     IV(18) = 15
  5736. C     XSCAL2 = 1
  5737. C     CALL NLTEST(15,15,11,'DAVI','DON1',RSTART)
  5738. C     IV(17) = MXFCSV
  5739. C     IV(18) = MXITSV
  5740. C     XSCAL2 = 3
  5741. C     CALL NLTEST(2,2,12,'FRDS','TEIN',RSTART)
  5742. C     XSCAL2 = 1
  5743. C     CALL NLTEST(31,6,13,'WATS','ON6 ',RSTART)
  5744. C     CALL NLTEST(31,9,14,'WATS','ON9 ',RSTART)
  5745. C     CALL NLTEST(31,12,15,'WATS','ON12',RSTART)
  5746. C     MXFCSV = IV(17)
  5747. C     IV(17) = 20
  5748. C     MXITSV = IV(18)
  5749. C     IV(18) = 15
  5750. C     CALL NLTEST(31,20,16,'WATS','ON20',RSTART)
  5751. C     IV(17) = MXFCSV
  5752. C     IV(18) = MXITSV
  5753. C     XSCAL2 = 2
  5754. C     CALL NLTEST(8,8,17,'CHEB','QD8 ',RSTART)
  5755. C     XSCAL2 = 3
  5756. C     CALL NLTEST(20,4,18,'BROW','N   ',RSTART)
  5757. C     CALL NLTEST(15,3,19,'BARD','    ',RSTART)
  5758. C     XSCAL2 = 1
  5759. C     CALL NLTEST(10,2,20,'JENN','RICH',RSTART)
  5760. C     XSCAL2 = 3
  5761. C     CALL NLTEST(11,4,21,'KOWA','LIK ',RSTART)
  5762. C     XSCAL2 = 1
  5763. C     CALL NLTEST(33,5,22,'OSBO','RNE1',RSTART)
  5764. C     XSCAL2 = 2
  5765. C     CALL NLTEST(65,11,23,'OSBO','RNE2',RSTART)
  5766. C     XSCAL2 = 3
  5767. C     CALL NLTEST(3,2,24,'MADS','EN  ',RSTART)
  5768. C     XSCAL2 = 1
  5769. C     IV(17) = 400
  5770. C     IV(18) = 300
  5771. C     CALL NLTEST(16,3,25,'MEYE','R   ',RSTART)
  5772. C/
  5773. C  ***  BROWN5  ***
  5774. C     CALL NLTEST(5,5,26,4HBROW,4HN5  ,RSTART)
  5775. C  ***  BROWN10  ***
  5776. C     CALL NLTEST(10,10,27,4HBROW,4HN10 ,RSTART)
  5777. C  ***  BROWN30  ***
  5778. C     CALL NLTEST(30,30,28,4HBROW,4HN30 ,RSTART)
  5779. C  ***  BROWN40  ***
  5780. C     CALL NLTEST(40,40,29,4HBROW,4HN40 ,RSTART)
  5781. C  ***  BARD+10 ***
  5782. C     CALL NLTEST(15,3,30,4HBARD,4H+10 ,RSTART)
  5783. C  ***  KOWALIK AND OSBORNE + 10  ***
  5784. C     CALL NLTEST(11,4,31,4HKOWA,4HL+10,RSTART)
  5785. C  ***  MEYER + 10  ***
  5786. C     CALL NLTEST(16,3,32,4HMEYE,4HR+10,RSTART)
  5787. C  ***  WATSON6 + 10  ***
  5788. C     CALL NLTEST(31,6,33,4HWAT6,4H+10 ,RSTART)
  5789. C  ***  WATSON9 + 10  ***
  5790. C     CALL NLTEST(31,9,34,4HWAT9,4H+10 ,RSTART)
  5791. C  ***  WATSON12 + 10  ***
  5792. C     CALL NLTEST(31,12,35,4HWAT1,4H2+10,RSTART)
  5793. C  ***  WATSON20 + 10  ***
  5794. C     CALL NLTEST(31,20,36,4HWAT2,4H0+10,RSTART)
  5795. C
  5796. C  ***  REPEAT TWO TESTS USING FINITE-DIFFERENCE JACOBIAN  ***
  5797. C
  5798.       JAC = 2
  5799.       XSCAL2 = 1
  5800. C
  5801.       IV(17) = 50
  5802.       IV(18) = 40
  5803. C/6
  5804.       CALL NLTEST(2,2,1,4HROSN,4HBROK,RSTART)
  5805. C/7
  5806. C     CALL NLTEST(2,2,1,'ROSN','BROK',RSTART)
  5807. C/
  5808.       V(29) = AMAX1(1.0E-7, V(29))
  5809.       IV(17) = 30
  5810.       IV(18) = 20
  5811. C  ***  BROWN  ***
  5812. C/6
  5813.       CALL NLTEST(20,4,18,4HBROW,4HN   ,RSTART)
  5814. C/7
  5815. C     CALL NLTEST(20,4,18,'BROW','N   ',RSTART)
  5816. C/
  5817. C
  5818.       IF (NPROB .EQ. 0 .OR. PU .EQ. 0) STOP
  5819.       CALL TODAY(DATIME)
  5820.       DO 130 K = 1, NPROB
  5821.          IF (MOD(K,56) .EQ. 1) WRITE(PU, 110) DATIME, NPROB
  5822.  110     FORMAT(1H1,11X,2A4,2X,2A4,10X,10HSUMMARY OF,I4,
  5823.      1          22H NL2SOL TEST RUNS.....,10X,
  5824.      2          32H(* = FINITE-DIFFERENCE JACOBIAN)/
  5825.      3          48H0 PROBLEM    N   P  NITER   NF   NG  IV1  X0SCAL,5X,
  5826.      4          39HFINAL F     PRELDF     NRELDF     RELDX/)
  5827.          J = IS(6,K)
  5828.          WRITE(PU,120) JTYP(J), NAME(1,K), NAME(2,K),
  5829.      1                 (IS(I,K), I=1,5), IRC(K), (RS(I,K), I=1,5)
  5830.  120     FORMAT(1X,A1,2A4,2I4,I7,2I5,3X,A1,F9.1,E13.3,3E11.3)
  5831.  130     CONTINUE
  5832. C
  5833.       STOP
  5834. C...... LAST CARD OF NLMAIN ............................................
  5835.       END
  5836.       SUBROUTINE IVVSET(IV, V)                                          IVV00010
  5837. C
  5838. C  ***  SUPPLY NONDEFAULT IV AND V VALUES FOR NLMAIN  (NL2SOL VER. 2.2).
  5839. C
  5840.       INTEGER IV(24)
  5841.       REAL V(100)
  5842. C
  5843. C     ACTIVATE THE NEXT LINE TO TURN OFF DETAILED SUMMARY PRINTING
  5844. C     IV(21) = 0
  5845.       RETURN
  5846.       END
  5847.       SUBROUTINE NLTEST (N, P, NEX, TITLE1, TITLE2, RSTART)             NLT00010
  5848. C
  5849. C  ***  CALL NL2SOL, SAVE AND PRINT STATISTICS  ***
  5850. C
  5851. C
  5852.       INTEGER N, P, NEX
  5853.       LOGICAL RSTART
  5854. C/6
  5855.       REAL TITLE1, TITLE2
  5856. C/7
  5857. C     CHARACTER*4 TITLE1, TITLE2
  5858. C/
  5859. C
  5860.       COMMON /TESTCM/ V, RS, JAC, NOUT, NPROB, XSCAL1, XSCAL2, IS, IV
  5861.       COMMON /TESTCH/ NAME, IRC
  5862.       INTEGER IS(6,50), IV(80), JAC, NOUT, NPROB, XSCAL1, XSCAL2
  5863.       REAL RS(5,50)
  5864. C/6
  5865.       INTEGER IRC(50)
  5866.       REAL NAME(2,50)
  5867. C/7
  5868. C     CHARACTER NAME(2,50)*4, IRC(50)*1
  5869. C/
  5870.       REAL V(1736)
  5871. C
  5872.       LOGICAL RSTRT
  5873.       INTEGER I, IRUN, PU, UIP(1)
  5874. C/6
  5875.       INTEGER ALG(2), JTYP(2), RC(10)
  5876.       REAL DATIME(4)
  5877. C/7
  5878. C     CHARACTER*4 DATIME(4)
  5879. C     CHARACTER*2 ALG(2)
  5880. C     CHARACTER*1 JTYP(2), RC(10)
  5881. C/
  5882.       REAL ONE, T, URPARM(1), X(20), X0SCAL, ZERO
  5883. C
  5884. C     ***  EXTERNAL FUNCTIONS AND SUBROUTINES  ***
  5885. C
  5886.       EXTERNAL NL2SNO, NL2SOL, TESTR, TESTJ, TODAY, XINIT
  5887. C
  5888. C  ***  IV AND V SUBSCRIPTS  ***
  5889. C
  5890.       INTEGER F, F0, NFCALL, NFCOV, NGCALL, NITER, NREDUC, PREDUC,
  5891.      1        PRUNIT, RELDX
  5892. C
  5893. C/6
  5894.       DATA F/10/, F0/13/, NFCALL/6/, NFCOV/40/, NGCALL/30/,
  5895.      1     NGCOV/41/, NITER/31/, NREDUC/6/, PREDUC/7/,
  5896.      2     PRUNIT/21/, RELDX/17/
  5897. C/7
  5898. C     PARAMETER (F=10, F0=13, NFCALL=6, NFCOV=40, NGCALL=30,
  5899. C    1     NGCOV=41, NITER=31, NREDUC=6, PREDUC=7,
  5900. C    2     PRUNIT=21, RELDX=17)
  5901. C/
  5902. C/6
  5903.       DATA ONE/1.E+0/, ZERO/0.E+0/
  5904. C/7
  5905. C     PARAMETER (ONE=1.D+0, ZERO=0.D+0)
  5906. C/
  5907. C/6
  5908.       DATA ALG(1),ALG(2)/2HOL,2HNO/, JTYP(1),JTYP(2)/1H ,1H*/
  5909.       DATA RC(1)/1H./, RC(2)/1H+/, RC(3)/1HX/, RC(4)/1HR/, RC(5)/1HB/,
  5910.      1     RC(6)/1HA/, RC(7)/1HS/, RC(8)/1HF/, RC(9)/1HE/, RC(10)/1HI/
  5911. C/7
  5912. C     DATA ALG(1),ALG(2)/'OL','NO'/, JTYP(1),JTYP(2)/' ','*'/
  5913. C     DATA RC(1)/'.'/, RC(2)/'+'/, RC(3)/'X'/, RC(4)/'R'/, RC(5)/'B'/,
  5914. C    1     RC(6)/'A'/, RC(7)/'S'/, RC(8)/'F'/, RC(9)/'E'/, RC(10)/'I'/
  5915. C/
  5916. C
  5917. C-----------------------------------------------------------------------
  5918. C
  5919.       UIP(1) = NEX
  5920.       RSTRT = RSTART
  5921.       IF (RSTRT) GO TO 20
  5922.          PU = IV(PRUNIT)
  5923.          CALL TODAY(DATIME)
  5924.          IF (PU .NE. 0) WRITE(PU,10) ALG(JAC), TITLE1, TITLE2, DATIME
  5925.  10      FORMAT (1H1//11H ***** NL2S,A2,12H ON PROBLEM ,2A4,6H *****,6X,
  5926.      1           2A4,2X,2A4)
  5927. C
  5928.  20   DO 100 IRUN = XSCAL1, XSCAL2
  5929.          IF (RSTRT) GO TO 40
  5930.          IV(1) = 12
  5931.          X0SCAL = 1.0E1 ** (IRUN-1)
  5932. C
  5933. C        ***  INITIALIZE THE SOLUTION VECTOR X  ***
  5934.          CALL XINIT(P, X, NEX)
  5935.          DO 30 I = 1, P
  5936.  30           X(I) = X0SCAL * X(I)
  5937. C
  5938.  40      IF (JAC .EQ. 1)
  5939.      1             CALL NL2SOL(N,P,X,TESTR,TESTJ,IV,V,UIP,URPARM,TESTR)
  5940.          IF (JAC .EQ. 2)
  5941.      1             CALL NL2SNO(N,P,X,TESTR,IV,V,UIP,URPARM,TESTR)
  5942.          IF (.NOT. RSTRT .AND. NPROB .LT. 50) NPROB = NPROB + 1
  5943.          NAME(1,NPROB) = TITLE1
  5944.          NAME(2,NPROB) = TITLE2
  5945.          IS(1,NPROB) = N
  5946.          IS(2,NPROB) = P
  5947.          IS(3,NPROB) = IV(NITER)
  5948.          IS(4,NPROB) = IV(NFCALL) - IV(NFCOV)
  5949.          IS(5,NPROB) = IV(NGCALL) - IV(NGCOV)
  5950.          I = IV(1)
  5951.          IRC(NPROB) = RC(I)
  5952.          IS(6,NPROB) = JAC
  5953.          RS(1,NPROB) = X0SCAL
  5954.          RS(2,NPROB) = V(F)
  5955.          T = ONE
  5956.          IF (V(F0) .GT. ZERO) T = V(PREDUC) / V(F0)
  5957.          RS(3,NPROB) = T
  5958.          T = ONE
  5959.          IF (V(F0) .GT. ZERO) T = V(NREDUC) / V(F0)
  5960.          RS(4,NPROB) = T
  5961.          RS(5,NPROB) = V(RELDX)
  5962.          RSTRT = .FALSE.
  5963.          IF (NOUT .EQ. 0) GO TO 100
  5964.          IF (NPROB .EQ. 1) WRITE(NOUT,50) DATIME
  5965.  50      FORMAT(1H1,11X,2A4,2X,2A4,10X,24HNL2SOL TEST SUMMARY.....,10X,
  5966.      1          32H(* = FINITE-DIFFERENCE JACOBIAN)/
  5967.      2          48H0 PROBLEM    N   P  NITER   NF   NG  IV1  X0SCAL,5X,
  5968.      3          39HFINAL F     PRELDF     NRELDF     RELDX/)
  5969.          WRITE(NOUT,60) JTYP(JAC), TITLE1, TITLE2,
  5970.      1                (IS(I,NPROB),I=1,5),IRC(NPROB),(RS(I,NPROB),I=1,5)
  5971.  60      FORMAT(1X,A1,2A4,2I4,I7,2I5,3X,A1,F9.1,E13.3,3E11.3)
  5972.  100     CONTINUE
  5973. C
  5974.  999  RETURN
  5975. C  ***  LAST CARD OF NLTEST FOLLOWS  ***
  5976.       END
  5977.       SUBROUTINE TESTJ(N, P, X, NFCALL, J, UIPARM, URPARM, UFPARM)      TSJ00010
  5978. C
  5979. C  ***  PARAMETERS  ***
  5980. C
  5981.       INTEGER N, P, NFCALL, UIPARM(1)
  5982.       REAL X(P), J(N,P), URPARM(1)
  5983.       EXTERNAL UFPARM
  5984. C
  5985. C     ..................................................................
  5986. C     ..................................................................
  5987. C
  5988. C     *****PURPOSE.
  5989. C     THIS ROUTINE EVALUATES THE JACOBIAN MATRIX  J  FOR THE VARIOUS
  5990. C     TEST PROBLEMS LISTED IN REFERENCES (1), (2), AND (3).
  5991. C
  5992. C     *****PARAMETER DESCRIPTION.
  5993. C     ON INPUT.
  5994. C
  5995. C        NN IS THE ROW DIMENSION OF  J  AS DECLARED IN THE CALLING
  5996. C             PROGRAM.
  5997. C        N IS THE ACTUAL NUMBER OF ROWS IN  J  AND IS THE LENGTH OF  R.
  5998. C        P IS THE NUMBER OF PARAMETERS BEING ESTIMATED AND HENCE IS
  5999. C             THE LENGTH OF X.
  6000. C        X IS THE VECTOR OF PARAMETERS AT WHICH THE JACOBIAN MATRIX  J
  6001. C             IS TO BE COMPUTED.
  6002. C        NFCALL IS THE INVOCATION COUNT OF  TESTR  AT THE TIME WHEN  R
  6003. C             WAS EVALUATED AT  X.  TESTR IGNORES NFCALL.
  6004. C        R IS THE RESIDUAL VECTOR AT  X  (AND IS IGNORED).
  6005. C        NEX = UIPARM(1) IS THE INDEX OF THE PROBLEM CURRENTLY BEING
  6006. C             SOLVED.
  6007. C        URPARM IS A USER PARAMETER VECTOR (AND IS IGNORED).
  6008. C        UFPARM IS A USER ENTRY POINT PARAMETER (AND IS IGNORED).
  6009. C        TESTR IS THE SUBROUTINE THAT COMPUTES  R  (AND IS IGNORED).
  6010. C
  6011. C     ON OUTPUT.
  6012. C
  6013. C        J IS THE JACOBIAN MATRIX AT X.
  6014. C
  6015. C     *****APPLICATION AND USAGE RESTRICTIONS.
  6016. C     THESE TEST PROBLEMS MAY BE USED TO TEST LEAST-SQUARES SOLVERS
  6017. C     SUCH AS NL2SOL.  IN PARTICULAR, THESE PROBLEMS MAY BE USED TO
  6018. C     CHECK WHETHER  NL2SOL  HAS BEEN SUCCESSFULLY TRANSPORTED TO
  6019. C     A PARTICULAR MACHINE.
  6020. C
  6021. C     *****ALGORITHM NOTES.
  6022. C     NONE
  6023. C
  6024. C     *****SUBROUTINES AND FUNCTIONS CALLED.
  6025. C     NONE
  6026. C
  6027. C     *****REFERENCES
  6028. C     (1) GILL, P.E.; & MURRAY, W. (1976), ALGORITHMS FOR THE SOLUTION
  6029. C        OF THE NON-LINEAR LEAST-SQUARES PROBLEM, NPL REPORT NAC71.
  6030. C
  6031. C     (2) MEYER, R.R. (1970), THEORETICAL AND COMPUTATIONAL ASPECTS
  6032. C        OF NONLINEAR REGRESSION, PP. 465-486 OF NONLINEAR PROGRAMMING,
  6033. C        EDITED BY J.B. ROSEN, O.L.MANGASARIAN, AND K. RITTER,
  6034. C        ACADEMIC PRESS, NEW YORK.
  6035. C
  6036. C     (3) BROWN, K.M. (1969), A QUADRATICALLY CONVERGENT NEWTON-
  6037. C        LIKE METHOD BASED UPON GAUSSIAN ELIMINATION,
  6038. C        SIAM J. NUMER. ANAL. 6, PP. 560-569.
  6039. C
  6040. C     *****GENERAL.
  6041. C
  6042. C     THIS SUBROUTINE WAS WRITTEN IN CONNECTION WITH RESEARCH
  6043. C     SUPPORTED BY THE NATIONAL SCIENCE FOUNDATION UNDER GRANTS
  6044. C     MCS-7600324, DCR75-10143, 76-14311DSS, AND MCS76-11989.
  6045. C
  6046. C     ..................................................................
  6047. C     ..................................................................
  6048. C
  6049. C  ***  LOCAL VARIABLES AND CONSTANTS  ***
  6050. C
  6051.       REAL E, EXPMIN, R2, T, THETA, TI, TIM1, TIP1, TPI,
  6052.      1   TPIM1, TPIP1, TWOPI, U, UFTOLG, UKOW(11), V, W, Z, ZERO
  6053.       INTEGER I, K, NEX, NM1
  6054. C  ***  INTRINSIC FUNCTIONS  ***
  6055. C/+
  6056.       REAL ALOG, AMIN1, COS, EXP, FLOAT, SIN, SQRT
  6057. C/
  6058.       EXTERNAL RMDCON
  6059.       REAL RMDCON
  6060. C
  6061. C/6
  6062. C /6
  6063.       DATA TWOPI/6.283185E+0/, ZERO/0.E+0/
  6064. C /7
  6065. C     PARAMETER (TWOPI=6.283185E+0, ZERO=0.E+0)
  6066. C /
  6067. C/6
  6068. C/7
  6069. C     SAVE EXPMIN, UFTOLG
  6070. C/
  6071.       DATA UKOW(1)/4.0/, UKOW(2)/2.0/, UKOW(3)/1.0/,
  6072.      1   UKOW(4)/5.0E-1/, UKOW(5)/2.5E-1/, UKOW(6)/1.67E-1/,
  6073.      2   UKOW(7)/1.25E-1/, UKOW(8)/1.0E-1/, UKOW(9)/8.33E-2/,
  6074.      3   UKOW(10)/7.14E-2/, UKOW(11)/6.25E-2/
  6075. C  ***  MACHINE DEPENDENT CONSTANT  ***
  6076.       DATA EXPMIN/0.0/, UFTOLG/0./
  6077. C
  6078. C
  6079. C-----------------------------------------------------------------------
  6080. C
  6081.       NEX = UIPARM(1)
  6082.       GO TO (100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1100,
  6083.      1   1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2100,
  6084.      2   2200, 2300, 2400, 2500, 2600, 2700, 2800, 2900, 1900, 2100,
  6085.      3   2500, 1300, 1400, 1500, 1600), NEX
  6086. C
  6087. C  ***  ROSENBROCK  ***
  6088.  100  J(1,1) = -2.0E1*X(1)
  6089.       J(1,2) = 1.0E1
  6090.       J(2,1) = -1.0
  6091.       J(2,2) = 0.0
  6092.       GO TO 9999
  6093. C  ***  HELIX  ***
  6094.  200  T = X(1)**2 + X(2)**2
  6095.       TI = 1.E2/(TWOPI*T)
  6096.       J(1,1) = TI*X(2)
  6097.       T = 1.E1/SQRT(T)
  6098.       J(2,1) = X(1)*T
  6099.       J(3,1) = 0.
  6100.       J(1,2) = -TI*X(1)
  6101.       J(2,2) = X(2)*T
  6102.       J(3,2) = 0.
  6103.       J(1,3) = 1.E1
  6104.       J(2,3) = 0.
  6105.       J(3,3) = 1.
  6106.       GO TO 9999
  6107. C  ***  SINGULAR  ***
  6108.  300  DO 301 K = 1,4
  6109.          DO 301 I = 1,4
  6110.  301          J(I,K) = 0.
  6111.       J(1,1) = 1.
  6112.       J(1,2) = 1.E1
  6113.       J(2,3) = SQRT(5.)
  6114.       J(2,4) = -J(2,3)
  6115.       J(3,2) = 2.*(X(2) - 2.*X(3))
  6116.       J(3,3) = -2.*J(3,2)
  6117.       J(4,1) = SQRT(4.E1)*(X(1) - X(4))
  6118.       J(4,4) = -J(4,1)
  6119.       GO TO 9999
  6120. C  ***  WOODS  ***
  6121.  400  DO 401 K = 1,4
  6122.          DO 401 I = 1,7
  6123.  401            J(I,K) = 0.
  6124.       J(1,1) = -2.E1*X(1)
  6125.       J(1,2) = 1.E1
  6126.       J(2,1) = -1.
  6127.       J(3,4) = SQRT(9.E1)
  6128.       J(3,3) = -2.*X(3)*J(3,4)
  6129.       J(4,3) = -1.
  6130.       J(5,2) = SQRT(9.9)
  6131.       J(5,4) = J(5,2)
  6132.       J(6,2) = SQRT(0.2)
  6133.       J(7,4) = J(6,2)
  6134.       GO TO 9999
  6135. C  ***  ZANGWILL  ***
  6136.  500  DO 501 K = 1,3
  6137.          DO 501 I = 1,3
  6138.  501            J(I,K) = 1.
  6139.       J(1,2) = -1.
  6140.       J(2,1) = -1.
  6141.       J(3,3) = -1.
  6142.       GO TO 9999
  6143. C  ***  ENGVALL  ***
  6144.  600  J(1,1) = 2.*X(1)
  6145.       J(1,2) = 2.*X(2)
  6146.       J(1,3) = 2.*X(3)
  6147.       J(2,1) = J(1,1)
  6148.       J(2,2) = J(1,2)
  6149.       J(2,3) = 2.*(X(3) - 2.)
  6150.       J(3,1) = 1.
  6151.       J(3,2) = 1.
  6152.       J(3,3) = 1.
  6153.       J(4,1) = 1.
  6154.       J(4,2) = 1.
  6155.       J(4,3) = -1.
  6156.       T = 2.*(5.*X(3) - X(1) + 1.)
  6157.       J(5,1) = 3.*X(1)**2 - T
  6158.       J(5,2) = 6.*X(2)
  6159.       J(5,3) = 5.*T
  6160.       GO TO 9999
  6161. C  ***  BRANIN  ***
  6162.  700  J(1,1) = 4.
  6163.       J(1,2) = 4.
  6164.       J(2,1) = 3. + (X(1) - 2.)*(3.*X(1) - 2.*X(2) - 2.) +
  6165.      1   X(2)*X(2)
  6166.       J(2,2) = 1. + 2.*(2.*X(1) - X(2)*X(2)) - (X(1) - X(2))**2
  6167.       GO TO 9999
  6168. C  ***  BEALE  ***
  6169.  800  J(1,1) = X(2) - 1.
  6170.       J(1,2) = X(1)
  6171.       J(2,1) = X(2)**2 - 1.
  6172.       J(2,2) = 2.*X(1)*X(2)
  6173.       J(3,1) = X(2)**3 - 1.
  6174.       J(3,2) = 3.*X(1)*(X(2)**2)
  6175.       GO TO 9999
  6176. C  ***  CRAGG & LEVY  ***
  6177.  900  DO 901 I = 1,5
  6178.          DO 901 K = 1,4
  6179.  901          J(I,K) = 0.
  6180.       T = EXP(X(1))
  6181.       J(1,2) = -2.*(T - X(2))
  6182.       J(1,1) = -T * J(1,2)
  6183.       J(2,2) = 3.0E1*(X(2) - X(3))**2
  6184.       J(2,3) = -J(2,2)
  6185.       J(3,3) = 2.*SIN(X(3) - X(4))/(COS(X(3) - X(4)))**3
  6186.       J(3,4) = -J(3,3)
  6187.       J(4,1) = 4.*X(1)**3
  6188.       J(5,4) = 1.
  6189.       GO TO 9999
  6190. C  ***  BOX  ***
  6191.  1000 IF (EXPMIN .EQ. ZERO) EXPMIN = 1.999*ALOG(RMDCON(2))
  6192.       DO 1001 I = 1,10
  6193.          TI = -0.1*FLOAT(I)
  6194.          E = ZERO
  6195.          T = X(1)*TI
  6196.          IF (T .GE. EXPMIN) E = EXP(T)
  6197.          J(I,1) = TI*E
  6198.          E = ZERO
  6199.          T = X(2)*TI
  6200.          IF (T .GE. EXPMIN) E = EXP(T)
  6201.          J(I,2) = -TI*E
  6202.          J(I,3) = EXP(1.E1*TI) - EXP(TI)
  6203.  1001    CONTINUE
  6204.       GO TO 9999
  6205. C  ***  DAVIDON 1  ***
  6206.  1100 NM1 = N-1
  6207.       DO 1101 I = 1,NM1
  6208.          TI = FLOAT(I)
  6209.          T = 1.
  6210.          DO 1101 K = 1,P
  6211.               J(I,K) = T
  6212.               T = T*TI
  6213.  1101         CONTINUE
  6214.       J(N,1) = 1.
  6215.       DO 1102 K = 2,P
  6216.  1102    J(N,K) = 0.
  6217.       GO TO 9999
  6218. C  ***  FREUDENSTEIN & ROTH  ***
  6219.  1200 J(1,1) = 1.
  6220.       J(1,2) = -2. + X(2)*(1.E1 - 3.*X(2))
  6221.       J(2,1) = 1.
  6222.       J(2,2) = -1.4E1 + X(2)*(2. + 3.*X(2))
  6223.       GO TO 9999
  6224. C  ***  WATSON  ***
  6225.  1300 CONTINUE
  6226.  1400 CONTINUE
  6227.  1500 CONTINUE
  6228.  1600 DO 1603 I = 1,29
  6229.          TI = FLOAT(I)/2.9E1
  6230.          R2 = X(1)
  6231.          T= 1.
  6232.          DO 1601 K = 2,P
  6233.               T = T*TI
  6234.               R2 = R2 + T*X(K)
  6235.  1601    CONTINUE
  6236.          R2 = -2.*R2
  6237.          J(I,1) = R2
  6238.          T = 1.
  6239.          R2 = TI*R2
  6240.          DO 1602 K = 2,P
  6241.               J(I,K) = T*(FLOAT(K-1) + R2)
  6242.               T = T*TI
  6243.  1602    CONTINUE
  6244.  1603 CONTINUE
  6245.       DO 1604 I = 30,31
  6246.          DO 1604 K = 2,P
  6247.  1604         J(I,K) = 0.
  6248.       J(30,1) = 1.
  6249.       J(31,1) = -2.*X(1)
  6250.       J(31,2) = 1.
  6251.       GO TO 9999
  6252. C  ***  CHEBYQUAD  ***
  6253.  1700 DO 1701 K = 1,N
  6254.          TIM1 = -1./FLOAT(N)
  6255.          Z = 2.*X(K) - 1.
  6256.          TI = Z*TIM1
  6257.          TPIM1 = 0.
  6258.          TPI = 2.*TIM1
  6259.          Z = Z + Z
  6260.          DO 1701 I = 1,N
  6261.               J(I,K) = TPI
  6262.               TPIP1 = 4.*TI + Z*TPI - TPIM1
  6263.               TPIM1 = TPI
  6264.               TPI = TPIP1
  6265.               TIP1 = Z*TI - TIM1
  6266.               TIM1 = TI
  6267.               TI = TIP1
  6268.  1701         CONTINUE
  6269.       GO TO 9999
  6270. C  ***  BROWN AND DENNIS  ***
  6271.  1800 DO 1801 I = 1, N
  6272.          TI = 0.2*FLOAT(I)
  6273.          J(I,1) = 2.0*(X(1) + X(2)*TI - EXP(TI))
  6274.          J(I,2) = TI*J(I,1)
  6275.          T = SIN(TI)
  6276.          J(I,3) = 2.0*(X(3) + X(4)*T - COS(TI))
  6277.          J(I,4) = T*J(I,3)
  6278.  1801    CONTINUE
  6279.       GO TO 9999
  6280. C  ***  BARD  ***
  6281.  1900 DO 1901 I = 1,15
  6282.          J(I,1) = -1.
  6283.          U = FLOAT(I)
  6284.          V = 1.6E1 - U
  6285.          W = AMIN1 (U,V)
  6286.          T = U/(X(2)*V + X(3)*W)**2
  6287.          J(I,2) = V*T
  6288.          J(I,3) = W*T
  6289.  1901 CONTINUE
  6290.       GO TO 9999
  6291. C  *** JENNRICH & SAMPSON  ***
  6292.  2000 DO 2001 I = 1,10
  6293.          TI = FLOAT(I)
  6294.          J(I,1) = -TI*EXP(TI*X(1))
  6295.          J(I,2) = -TI*EXP(TI*X(2))
  6296.  2001    CONTINUE
  6297.       GO TO 9999
  6298. C  ***  KOWALIK & OSBORNE  ***
  6299.  2100 DO 2101 I = 1,11
  6300.          T = -1./(UKOW(I)**2 + X(3)*UKOW(I) + X(4))
  6301.          J(I,1) = T*(UKOW(I)**2 + X(2)*UKOW(I))
  6302.          J(I,2) = X(1)*UKOW(I)*T
  6303.          T = T*J(I,1)*X(1)
  6304.          J(I,3) = UKOW(I)*T
  6305.          J(I,4) = T
  6306.  2101 CONTINUE
  6307.       GO TO 9999
  6308. C  ***  OSBORNE 1  ***
  6309.  2200 DO 2201 I = 1,33
  6310.          TI = 1.0E1*FLOAT(1-I)
  6311.          J(I,1) = -1.
  6312.          J(I,2) = -EXP(X(4)*TI)
  6313.          J(I,3) = -EXP(X(5)*TI)
  6314.          J(I,4) = TI*X(2)*J(I,2)
  6315.          J(I,5) = TI*X(3)*J(I,3)
  6316.  2201    CONTINUE
  6317.       GO TO 9999
  6318. C  ***  OSBORNE 2  ***
  6319. C     ***  UFTOLG IS A MACHINE-DEPENDENT CONSTANT.  IT IS JUST SLIGHTLY
  6320. C     ***  LARGER THAN THE LOG OF THE SMALLEST POSITIVE MACHINE NUMBER.
  6321.  2300 IF (UFTOLG .EQ. 0.) UFTOLG = 1.999 * ALOG(RMDCON(2))
  6322.       DO 2302 I = 1,65
  6323.          TI = FLOAT(1 - I)*1.E-1
  6324.          J(I,1) = -EXP(X(5)*TI)
  6325.          J(I,5) = X(1)*TI*J(I,1)
  6326.          DO 2301 K = 2,4
  6327.               T = X(K + 7) + TI
  6328.               R2 = 0.
  6329.               THETA = -X(K+4)*T*T
  6330.               IF (THETA .GT. UFTOLG) R2 = -EXP(THETA)
  6331.               J(I,K) = R2
  6332.               R2 = -T*R2*X(K)
  6333.               J(I,K+4) = R2*T
  6334.               J(I,K+7) = 2.*X(K+4)*R2
  6335.  2301         CONTINUE
  6336.  2302    CONTINUE
  6337.       GO TO 9999
  6338. C  ***  MADSEN  ***
  6339.  2400 J(1,1) = 2.*X(1) + X(2)
  6340.       J(1,2) = 2.*X(2) + X(1)
  6341.       J(2,1) = COS(X(1))
  6342.       J(2,2) = 0.
  6343.       J(3,1) = 0.
  6344.       J(3,2) = -SIN(X(2))
  6345.       GO TO 9999
  6346. C  ***  MEYER  ***
  6347.  2500 DO 2501 I = 1, 16
  6348.          TI = FLOAT(5*I + 45)
  6349.          U = TI + X(3)
  6350.          T = EXP(X(2)/U)
  6351.          J(I,1) = T
  6352.          J(I,2) = X(1)*T/U
  6353.          J(I,3) = -X(1)*X(2)*T/(U*U)
  6354.  2501    CONTINUE
  6355.       GO TO 9999
  6356. C  ***  BROWN  ***
  6357.  2600 CONTINUE
  6358.  2700 CONTINUE
  6359.  2800 CONTINUE
  6360.  2900 NM1 = N - 1
  6361.       DO 2901 K = 1, N
  6362.          DO 2901 I = 1, NM1
  6363.               J(I,K) = 1.0
  6364.               IF (I .EQ. K) J(I,K) = 2.0
  6365.  2901         CONTINUE
  6366.       DO 2903 K = 1, N
  6367.          T = 1.0
  6368.          DO 2902 I = 1,N
  6369.               IF (I .NE. K) T = T*X(I)
  6370.  2902         CONTINUE
  6371.          J(N,K) = T
  6372.  2903    CONTINUE
  6373.       GO TO 9999
  6374. C
  6375. C
  6376.  9999 RETURN
  6377.       END
  6378.       SUBROUTINE TESTR(N, P, X, NFCALL, R, UIPARM, URPARM, UFPARM)      TES00010
  6379. C
  6380. C     *****PARAMETERS.
  6381. C
  6382.       INTEGER N, P, NFCALL, UIPARM(1)
  6383.       REAL X(P), R(N), URPARM(1)
  6384.       EXTERNAL UFPARM
  6385. C
  6386. C     ..................................................................
  6387. C     ..................................................................
  6388. C
  6389. C     *****PURPOSE.
  6390. C     THIS ROUTINE EVALUATES  R  FOR THE VARIOUS TEST FUNCTIONS IN
  6391. C        REFERENCES (1), (2), AND (3), AS WELL AS FOR SOME VARIATIONS
  6392. C        SUGGESTED BY JORGE MORE (PRIVATE COMMUNICATION) ON SOME OF
  6393. C        THESE TEST PROBLEMS (FOR NEX .GE. 30).
  6394. C
  6395. C     *****PARAMETER DESCRIPTION.
  6396. C     ON INPUT.
  6397. C
  6398. C        N IS THE LENGTH OF R.
  6399. C        P IS THE LENGTH OF X.
  6400. C        X IS THE POINT AT WHICH THE RESIDUAL VECTOR R IS TO BE
  6401. C             COMPUTED.
  6402. C        NFCALL IS THE INVOCATION COUNT OF TESTR.
  6403. C        NEX = UIPARM(1) IS THE INDEX OF THE PROBLEM CURRENTLY BEING
  6404. C             SOLVED.
  6405. C        URPARM IS A USER PARAMETER VECTOR (AND IS IGNORED).
  6406. C        UFPARM IS A USER ENTRY POINT PARAMETER (AND IS IGNORED).
  6407. C
  6408. C     ON OUTPUT.
  6409. C
  6410. C        R IS THE RESIDUAL VECTOR AT X.
  6411. C
  6412. C     *****APPLICATION AND USAGE RESTRICTIONS.
  6413. C     THESE TEST PROBLEMS MAY BE USED TO TEST LEAST-SQUARES SOLVERS
  6414. C     SUCH AS NL2SOL.  IN PARTICULAR, THESE PROBLEMS MAY BE USED TO
  6415. C     CHECK WHETHER  NL2SOL  HAS BEEN SUCCESSFULLY TRANSPORTED TO
  6416. C     A PARTICULAR MACHINE.
  6417. C
  6418. C     *****ALGORITHM NOTES.
  6419. C     NONE
  6420. C
  6421. C     *****SUBROUTINES AND FUNCTIONS CALLED.
  6422. C     NONE
  6423. C
  6424. C     *****REFERENCES
  6425. C     (1) GILL, P.E.. & MURRAY, W. (1976), ALGORITHMS FOR THE SOLUTION
  6426. C        OF THE NON-LINEAR LEAST-SQUARES PROBLEM, NPL REPORT NAC71.
  6427. C
  6428. C     (2) MEYER, R.R. (1970), THEORETICAL AND COMPUTATIONAL ASPECTS
  6429. C        OF NONLINEAR REGRESSION, PP. 465-486 OF NONLINEAR PROGRAMMING,
  6430. C        EDITED BY J.B. ROSEN, O.L.MANGASARIAN, AND K. RITTER,
  6431. C        ACADEMIC PRESS, NEW YORK.
  6432. C
  6433. C     (3) BROWN, K.M. (1969), A QUADRATICALLY CONVERGENT NEWTON-
  6434. C        LIKE METHOD BASED UPON GAUSSIAN ELIMINATION,
  6435. C        SIAM J. NUMER. ANAL. 6, PP. 560-569.
  6436. C
  6437. C     *****GENERAL.
  6438. C
  6439. C     THIS SUBROUTINE WAS WRITTEN IN CONNECTION WITH RESEARCH
  6440. C     SUPPORTED BY THE NATIONAL SCIENCE FOUNDATION UNDER GRANTS
  6441. C     MCS-7600324, DCR75-10143, 76-14311DSS, AND MCS76-11989.
  6442. C
  6443. C     ..................................................................
  6444. C     ..................................................................
  6445. C
  6446. C  ***  LOCAL VARIABLES AND CONSTANTS  ***
  6447. C
  6448.       REAL E1, E2, FLOATN, RI, R1, R2, T, THETA, TI, TIM1,
  6449.      1             TIP1, TWOPI, T1, T2, U, V, W, Z
  6450.       REAL YBARD(15), YKOW(11), UKOW(11), YOSB1(33),
  6451.      1             YOSB2(65), YMEYER(16)
  6452.       INTEGER I, J, NEX, NM1
  6453.       REAL EXPMAX, EXPMIN, UFTOLG
  6454. C  ***  INTRINSIC FUNCTIONS  ***
  6455. C/+
  6456.       INTEGER MOD
  6457.       REAL ALOG, AMIN1, ATAN2, COS, EXP, FLOAT, SIN, SQRT
  6458. C/
  6459.       EXTERNAL RMDCON
  6460.       REAL RMDCON
  6461. C /6
  6462.       DATA TWOPI/6.283185E+0/
  6463. C /7
  6464. C     PARAMETER (TWOPI=6.283185E+0)
  6465. C /
  6466. C/6
  6467. C/7
  6468. C     SAVE EXPMAX, EXPMIN, UFTOLG
  6469. C/
  6470.       DATA YBARD(1)/1.4E-1/, YBARD(2)/1.8E-1/, YBARD(3)/2.2E-1/,
  6471.      1   YBARD(4)/2.5E-1/, YBARD(5)/2.9E-1/, YBARD(6)/3.2E-1/,
  6472.      2   YBARD(7)/3.5E-1/, YBARD(8)/3.9E-1/, YBARD(9)/3.7E-1/,
  6473.      3   YBARD(10)/5.8E-1/, YBARD(11)/7.3E-1/, YBARD(12)/9.6E-1/,
  6474.      4   YBARD(13)/1.34/, YBARD(14)/2.10/, YBARD(15)/4.39/
  6475.       DATA YKOW(1)/1.957E-1/, YKOW(2)/1.947E-1/, YKOW(3)/1.735E-1/,
  6476.      1   YKOW(4)/1.600E-1/, YKOW(5)/8.44E-2/, YKOW(6)/6.27E-2/,
  6477.      2   YKOW(7)/4.56E-2/, YKOW(8)/3.42E-2/, YKOW(9)/3.23E-2/,
  6478.      3   YKOW(10)/2.35E-2/, YKOW(11)/2.46E-2/
  6479.       DATA UKOW(1)/4.0/, UKOW(2)/2.0/, UKOW(3)/1.0/,
  6480.      1   UKOW(4)/5.0E-1/, UKOW(5)/2.5E-1/, UKOW(6)/1.67E-1/,
  6481.      2   UKOW(7)/1.25E-1/, UKOW(8)/1.0E-1/, UKOW(9)/8.33E-2/,
  6482.      3   UKOW(10)/7.14E-2/, UKOW(11)/6.25E-2/
  6483.       DATA YOSB1(1)/8.44E-1/, YOSB1(2)/9.08E-1/, YOSB1(3)/9.32E-1/,
  6484.      1   YOSB1(4)/9.36E-1/, YOSB1(5)/9.25E-1/, YOSB1(6)/9.08E-1/,
  6485.      2   YOSB1(7)/8.81E-1/, YOSB1(8)/8.50E-1/, YOSB1(9)/8.18E-1/,
  6486.      3   YOSB1(10)/7.84E-1/, YOSB1(11)/7.51E-1/, YOSB1(12)/7.18E-1/,
  6487.      4   YOSB1(13)/6.85E-1/, YOSB1(14)/6.58E-1/, YOSB1(15)/6.28E-1/,
  6488.      5   YOSB1(16)/6.03E-1/, YOSB1(17)/5.80E-1/, YOSB1(18)/5.58E-1/,
  6489.      6   YOSB1(19)/5.38E-1/, YOSB1(20)/5.22E-1/, YOSB1(21)/5.06E-1/,
  6490.      7   YOSB1(22)/4.90E-1/, YOSB1(23)/4.78E-1/, YOSB1(24)/4.67E-1/,
  6491.      8   YOSB1(25)/4.57E-1/, YOSB1(26)/4.48E-1/, YOSB1(27)/4.38E-1/,
  6492.      9   YOSB1(28)/4.31E-1/, YOSB1(29)/4.24E-1/, YOSB1(30)/4.20E-1/,
  6493.      A   YOSB1(31)/4.14E-1/, YOSB1(32)/4.11E-1/, YOSB1(33)/4.06E-1/
  6494.       DATA YOSB2(1)/1.366/, YOSB2(2)/1.191/, YOSB2(3)/1.112/,
  6495.      1   YOSB2(4)/1.013/, YOSB2(5)/9.91E-1/, YOSB2(6)/8.85E-1/,
  6496.      2   YOSB2(7)/8.31E-1/, YOSB2(8)/8.47E-1/, YOSB2(9)/7.86E-1/,
  6497.      3   YOSB2(10)/7.25E-1/, YOSB2(11)/7.46E-1/, YOSB2(12)/6.79E-1/,
  6498.      4   YOSB2(13)/6.08E-1/, YOSB2(14)/6.55E-1/, YOSB2(15)/6.16E-1/,
  6499.      5   YOSB2(16)/6.06E-1/, YOSB2(17)/6.02E-1/, YOSB2(18)/6.26E-1/,
  6500.      6   YOSB2(19)/6.51E-1/, YOSB2(20)/7.24E-1/, YOSB2(21)/6.49E-1/,
  6501.      7   YOSB2(22)/6.49E-1/, YOSB2(23)/6.94E-1/, YOSB2(24)/6.44E-1/,
  6502.      8   YOSB2(25)/6.24E-1/, YOSB2(26)/6.61E-1/, YOSB2(27)/6.12E-1/,
  6503.      9   YOSB2(28)/5.58E-1/, YOSB2(29)/5.33E-1/, YOSB2(30)/4.95E-1/,
  6504.      A   YOSB2(31)/5.00E-1/, YOSB2(32)/4.23E-1/, YOSB2(33)/3.95E-1/,
  6505.      B   YOSB2(34)/3.75E-1/, YOSB2(35)/3.72E-1/, YOSB2(36)/3.91E-1/,
  6506.      C   YOSB2(37)/3.96E-1/, YOSB2(38)/4.05E-1/, YOSB2(39)/4.28E-1/,
  6507.      D   YOSB2(40)/4.29E-1/, YOSB2(41)/5.23E-1/, YOSB2(42)/5.62E-1/,
  6508.      E   YOSB2(43)/6.07E-1/, YOSB2(44)/6.53E-1/, YOSB2(45)/6.72E-1/,
  6509.      F   YOSB2(46)/7.08E-1/, YOSB2(47)/6.33E-1/, YOSB2(48)/6.68E-1/,
  6510.      G   YOSB2(49)/6.45E-1/, YOSB2(50)/6.32E-1/, YOSB2(51)/5.91E-1/,
  6511.      H   YOSB2(52)/5.59E-1/, YOSB2(53)/5.97E-1/, YOSB2(54)/6.25E-1/,
  6512.      I   YOSB2(55)/7.39E-1/, YOSB2(56)/7.10E-1/, YOSB2(57)/7.29E-1/,
  6513.      J   YOSB2(58)/7.20E-1/, YOSB2(59)/6.36E-1/, YOSB2(60)/5.81E-1/
  6514.       DATA YOSB2(61)/4.28E-1/, YOSB2(62)/2.92E-1/, YOSB2(63)/1.62E-1/,
  6515.      1   YOSB2(64)/9.8E-2/, YOSB2(65)/5.4E-2/
  6516.       DATA YMEYER(1)/3.478E4/, YMEYER(2)/2.861E4/, YMEYER(3)/2.365E4/,
  6517.      1   YMEYER(4)/1.963E4/, YMEYER(5)/1.637E4/, YMEYER(6)/1.372E4/,
  6518.      2   YMEYER(7)/1.154E4/, YMEYER(8)/9.744E3/, YMEYER(9)/8.261E3/,
  6519.      3   YMEYER(10)/7.030E3/, YMEYER(11)/6.005E3/, YMEYER(12)/5.147E3/,
  6520.      4   YMEYER(13)/4.427E3/, YMEYER(14)/3.820E3/, YMEYER(15)/3.307E3/,
  6521.      5   YMEYER(16)/2.872E3/
  6522. C
  6523.       DATA EXPMAX/0./, UFTOLG/0./
  6524. C
  6525. C
  6526. C-----------------------------------------------------------------------
  6527. C
  6528.       NEX = UIPARM(1)
  6529.       GO TO (100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1100,
  6530.      1   1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2100,
  6531.      2   2200, 2300, 2400, 2500, 2600, 2700, 2800, 2900, 1900, 2100,
  6532.      3   2500, 1300, 1400, 1500, 1600), NEX
  6533. C
  6534. C  ***  ROSENBROCK   ***
  6535.  100  R(1) = 1.0E1*(X(2) - X(1)**2)
  6536.       R(2) = 1.0 - X(1)
  6537.       GO TO 9999
  6538. C  ***  HELIX   ***
  6539.  200  THETA = ATAN2(X(2), X(1))/TWOPI
  6540.       IF (X(1) .LE. 0. .AND. X(2) .LE. 0.) THETA = THETA + 1.
  6541.       R(1) = 1.0E1*(X(3) - 1.0E1*THETA)
  6542.       R(2) = 1.0E1*(SQRT(X(1)**2 + X(2)**2) - 1.0)
  6543.       R(3) = X(3)
  6544.       GO TO 9999
  6545. C  ***  SINGULAR   ***
  6546.  300  R(1) = X(1) + 1.0E1*X(2)
  6547.       R(2) = SQRT(5.0)*(X(3) - X(4))
  6548.       R(3) = (X(2) - 2.0*X(3))**2
  6549.       R(4) = SQRT(1.0E1)*(X(1) - X(4))**2
  6550.       GO TO 9999
  6551. C  ***  WOODS   ***
  6552.  400  R(1) = 1.0E1*(X(2) - X(1)**2)
  6553.       R(2) = 1.0 - X(1)
  6554.       R(3) = SQRT(9.0E1)*(X(4) - X(3)**2)
  6555.       R(4) = 1.0 - X(3)
  6556.       R(5) = SQRT(9.9)*(X(2) + X(4) - 2.)
  6557.       T = SQRT(2.0E-1)
  6558.       R(6) = T*(X(2) - 1.0)
  6559.       R(7) = T*(X(4) - 1.0)
  6560.       GO TO 9999
  6561. C  ***  ZANGWILL
  6562.  500  R(1) = X(1) - X(2) + X(3)
  6563.       R(2) = -X(1) + X(2) + X(3)
  6564.       R(3) = X(1) + X(2) - X(3)
  6565.       GO TO 9999
  6566. C  ***  ENGVALL   ***
  6567.  600  R(1) = X(1)**2 + X(2)**2 + X(3)**2 - 1.0
  6568.       R(2) = X(1)**2 + X(2)**2 + (X(3) - 2.0)**2 - 1.0
  6569.       R(3) = X(1) + X(2) + X(3) - 1.0
  6570.       R(4) = X(1) + X(2) - X(3) + 1.0
  6571.       R(5) = X(1)**3 + 3.0*X(2)**2 + (5.0*X(3) - X(1) + 1.0)**2
  6572.      1               - 3.6E1
  6573.       GO TO 9999
  6574. C  ***  BRANIN ***
  6575.  700  R(1) = 4.0*(X(1) + X(2))
  6576.       R(2) = R(1) + (X(1) - X(2))*((X(1) - 2.0)**2 +
  6577.      1       X(2)**2 - 1.0)
  6578.       GO TO 9999
  6579. C  ***  BEALE  ***
  6580.  800  R(1) = 1.5 - X(1)*(1.0 - X(2))
  6581.       R(2) = 2.25 - X(1)*(1.0 - X(2)**2)
  6582.       R(3) = 2.625 - X(1)*(1.0 -  X(2)**3)
  6583.       GO TO 9999
  6584. C  ***  CRAGG AND LEVY  ***
  6585.  900  R(1) = (EXP(X(1)) - X(2))**2
  6586.       R(2) = 1.0E1*(X(2) - X(3))**3
  6587.       R(3) = ( SIN(X(3) - X(4)) / COS(X(3) - X(4)) )**2
  6588.       R(4) = X(1)**4
  6589.       R(5) = X(4) - 1.0
  6590.       GO TO 9999
  6591. C  ***  BOX  ***
  6592.  1000 IF (EXPMAX .GT. 0.) GO TO 1001
  6593.          EXPMAX = 1.999 * ALOG(RMDCON(5))
  6594.          EXPMIN = 1.999 * ALOG(RMDCON(2))
  6595.  1001 IF (-EXPMAX .GE. AMIN1(X(1), X(2), X(3))) GO TO 1003
  6596.       DO 1002 I = 1,10
  6597.          TI = -0.1*FLOAT(I)
  6598.          T1 = TI*X(1)
  6599.          E1 = 0.
  6600.          IF (T1 .GT. EXPMIN) E1 = EXP(T1)
  6601.          T2 = TI*X(2)
  6602.          E2 = 0.
  6603.          IF (T2 .GT. EXPMIN) E2 = EXP(T2)
  6604.          R(I) = (E1 - E2) - X(3)*(EXP(TI) - EXP(1.0E1*TI))
  6605.  1002 CONTINUE
  6606.       GO TO 9999
  6607.  1003 NFCALL = -1
  6608.       GO TO 9999
  6609. C  ***  DAVIDON 1  ***
  6610.  1100 NM1 = N - 1
  6611.       DO 1102 I = 1, NM1
  6612.          R1 = 0.0
  6613.          TI = FLOAT(I)
  6614.          T = 1.
  6615.          DO 1101 J = 1,P
  6616.               R1 = R1 + T*X(J)
  6617.               T = T*TI
  6618.  1101         CONTINUE
  6619.          R(I) = R1
  6620.  1102    CONTINUE
  6621.       R(N) = X(1) - 1.0
  6622.       GO TO 9999
  6623. C  ***  FREUDENSTEIN AND ROTH  ***
  6624.  1200 R(1) = -1.3E1 + X(1) - 2.0*X(2) + 5.0*X(2)**2 - X(2)**3
  6625.       R(2) = -2.9E1 + X(1) - 1.4E1*X(2) + X(2)**2 + X(2)**3
  6626.       GO TO 9999
  6627. C  ***  WATSON  ***
  6628.  1300  CONTINUE
  6629.  1400  CONTINUE
  6630.  1500  CONTINUE
  6631.  1600 DO 1602 I = 1, 29
  6632.          TI = FLOAT(I)/2.9E1
  6633.          R1 = 0.0
  6634.          R2 = X(1)
  6635.          T = 1.0
  6636.          DO 1601 J = 2, P
  6637.               R1 = R1 + FLOAT(J-1)*T*X(J)
  6638.               T = T*TI
  6639.               R2 = R2 + T*X(J)
  6640.  1601         CONTINUE
  6641.          R(I) = R1 - R2*R2 - 1.0
  6642.          IF (NEX .GE. 33 .AND. NEX .LE. 36) R(I) = R(I) + 10.
  6643.  1602    CONTINUE
  6644.       R(30) = X(1)
  6645.       R(31) = X(2) - X(1)**2 - 1.0
  6646.       IF (NEX .LT. 33 .OR. NEX .GT. 36) GO TO 9999
  6647.       R(30) = R(30) + 10.
  6648.       R(31) = R(31) + 10.
  6649.       GO TO 9999
  6650. C  ***  CHEBYQUAD  ***
  6651.  1700 DO 1701 I = 1,N
  6652.  1701    R(I) = 0.0
  6653.       DO 1702 J = 1,N
  6654.          TIM1 = 1.0
  6655.          TI = 2.0*X(J) - 1.0
  6656.          Z = TI + TI
  6657.          DO 1702 I = 1,N
  6658.               R(I) = R(I) + TI
  6659.               TIP1 = Z*TI -TIM1
  6660.               TIM1 = TI
  6661.               TI = TIP1
  6662.  1702         CONTINUE
  6663.       FLOATN = FLOAT(N)
  6664.       DO 1703 I = 1,N
  6665.          TI = 0.0
  6666.          IF (MOD(I,2) .EQ. 0) TI = -1.0/FLOAT(I*I - 1)
  6667.          R(I) = TI - R(I)/FLOATN
  6668.  1703    CONTINUE
  6669.       GO TO 9999
  6670. C  ***  BROWN AND DENNIS  ***
  6671.  1800  DO 1801 I = 1, N
  6672.          TI = 0.2*FLOAT(I)
  6673.          R(I) = (X(1) + X(2)*TI - EXP(TI))**2 +
  6674.      1             (X(3) + X(4)*SIN(TI) - COS(TI))**2
  6675.  1801    CONTINUE
  6676.       GO TO 9999
  6677. C  ***  BARD  ***
  6678.  1900 DO 1901 I = 1, 15
  6679.          U = FLOAT(I)
  6680.          V = 1.6E1 - U
  6681.          W = AMIN1(U,V)
  6682.          R(I) = YBARD(I) - (X(1) + U/(X(2)*V + X(3)*W))
  6683.          IF (NEX .EQ. 30) R(I) = R(I) + 10.
  6684.  1901    CONTINUE
  6685.       GO TO 9999
  6686. C  ***  JENNRICH AND SAMPSON  ***
  6687.  2000 DO 2001 I = 1, 10
  6688.          TI = FLOAT(I)
  6689.          R(I) = 2.0 + 2.0*TI - (EXP(TI*X(1)) +
  6690.      1          EXP(TI*X(2)))
  6691.  2001    CONTINUE
  6692.       GO TO 9999
  6693. C  ***  KOWALIK AND OSBORNE  ***
  6694.  2100 DO 2101 I = 1, 11
  6695.          R(I) = YKOW(I) - X(1)*(UKOW(I)**2 + X(2)*UKOW(I))/(UKOW(I)**2 +
  6696.      1          X(3)*UKOW(I) + X(4))
  6697.          IF (NEX .EQ. 31) R(I) = R(I) + 10.
  6698.  2101    CONTINUE
  6699.       GO TO 9999
  6700. C  ***  OSBORNE 1  ***
  6701.  2200 DO 2201 I = 1, 33
  6702.          TI = 1.0E1*FLOAT(1-I)
  6703.          R(I) = YOSB1(I) - (X(1) + X(2)*EXP(X(4)*TI) +
  6704.      1          X(3)*EXP(X(5)*TI))
  6705.  2201    CONTINUE
  6706.       GO TO 9999
  6707. C  ***  OSBORNE 2  ***
  6708. C     ***  UFTOLG IS A MACHINE-DEPENDENT CONSTANT.  IT IS JUST SLIGHTLY
  6709. C     ***  LARGER THAN THE LOG OF THE SMALLEST POSITIVE MACHINE NUMBER.
  6710.  2300 IF (UFTOLG .EQ. 0.) UFTOLG = 1.999 * ALOG(RMDCON(2))
  6711.       DO 2302 I = 1, 65
  6712.          TI = 0.1*FLOAT(1-I)
  6713.          RI = X(1)*EXP(X(5)*TI)
  6714.          DO 2301 J = 2, 4
  6715.               T = 0.
  6716.               THETA = -X(J+4) * (TI + X(J+7))**2
  6717.               IF (THETA .GT. UFTOLG) T = EXP(THETA)
  6718.               RI = RI + X(J)*T
  6719.  2301         CONTINUE
  6720.          R(I) = YOSB2(I) - RI
  6721.  2302 CONTINUE
  6722.       GO TO 9999
  6723. C  ***  MADSEN  ***
  6724.  2400 R(1) = X(1)**2 + X(2)**2 + X(1)*X(2)
  6725.       R(2) = SIN(X(1))
  6726.       R(3) = COS(X(2))
  6727.       GO TO 9999
  6728. C  ***  MEYER  ***
  6729.  2500 DO 2501 I = 1, 16
  6730.          TI = FLOAT(5*I + 45)
  6731.          R(I)=X(1)*EXP(X(2)/(TI + X(3))) - YMEYER(I)
  6732.          IF (NEX .EQ. 32) R(I) = R(I) + 10.
  6733.  2501    CONTINUE
  6734.       GO TO 9999
  6735. C  ***  BROWN  ***
  6736.  2600 CONTINUE
  6737.  2700 CONTINUE
  6738.  2800 CONTINUE
  6739.  2900 T = X(1) - FLOAT(N + 1)
  6740.       DO 2901 I = 2, N
  6741.  2901    T = T + X(I)
  6742.       NM1 = N - 1
  6743.       DO 2902 I = 1, NM1
  6744.  2902    R(I) = T + X(I)
  6745.       T = X(1)
  6746.       DO 2903 I = 2, N
  6747.  2903    T = T * X(I)
  6748.       R(N) = T - 1.0
  6749.       GO TO 9999
  6750. C
  6751.  9999 RETURN
  6752. C     ..... LAST CARD OF TESTR .........................................
  6753.       END
  6754.       SUBROUTINE TODAY(DATIME)                                          TOD00010
  6755. C
  6756. C  ***  SUPPLY SUMSOL VERSION  ***
  6757. C
  6758. C/6
  6759.       REAL DATIME(4), DT1, DT2, DT3, DT4
  6760.       DATA DT1,DT2,DT3,DT4/4HNL2S,4HOL  ,4HVER.,4H2.2 /
  6761. C/7
  6762. C     CHARACTER*4 DATIME(4), DT1, DT2, DT3, DT4
  6763. C     DATA DT1,DT2,DT3,DT4/'NL2S','OL  ','VER.','2.2 '/
  6764. C/
  6765. C
  6766.       DATIME(1) = DT1
  6767.       DATIME(2) = DT2
  6768.       DATIME(3) = DT3
  6769.       DATIME(4) = DT4
  6770.  999  RETURN
  6771. C  ***  LAST LINE OF DATIME FOLLOWS  ***
  6772.       END
  6773.       SUBROUTINE XINIT(P, X, NEX)                                       XIN00010
  6774. C
  6775. C     *****PARAMETERS...
  6776. C
  6777.       INTEGER NEX, P
  6778.       REAL X(P)
  6779. C
  6780. C     ..................................................................
  6781. C
  6782. C     *****PURPOSE...
  6783. C     THIS ROUTINE INITIALIZES THE SOLUTION VECTOR X ACCORDING TO
  6784. C     THE INITIAL VALUES FOR THE VARIOUS TEST FUNCTIONS GIVEN IN
  6785. C     REFERENCES (1), (2), AND (3).
  6786. C     SUBROUTINES TESTR AND TESTJ.  (SEE TESTR FOR REFERENCES.)
  6787. C
  6788. C     *****PARAMETER DESCRIPTION...
  6789. C     ON INPUT...
  6790. C
  6791. C        NEX IS THE TEST PROBLEM NUMBER.
  6792. C
  6793. C        P IS THE NUMBER OF PARAMETERS.
  6794. C
  6795. C     ON OUTPUT...
  6796. C
  6797. C        X IS THE INITIAL GUESS TO THE SOLUTION.
  6798. C
  6799. C     *****APPLICATION AND USAGE RESTRICTIONS...
  6800. C     THIS ROUTINE IS CALLED BY NLTEST.
  6801. C
  6802. C     ..................................................................
  6803. C
  6804. C     *****LOCAL VARIABLES...
  6805.       INTEGER I
  6806.       REAL PP1INV
  6807. C     *****INTRINSIC FUNCTIONS...
  6808. C/+
  6809.       REAL FLOAT
  6810. C/
  6811. C
  6812.       GO TO (100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1100,
  6813.      1   1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2100,
  6814.      2   2200, 2300, 2400, 2500, 2600, 2700, 2800, 2900, 1900, 2100,
  6815.      3   2500, 1300, 1400, 1500, 1600),NEX
  6816. C
  6817. C  ***  ROSENBROCK  ***
  6818.  100  X(1) = -1.2
  6819.       X(2) = 1.0
  6820.       GO TO 9999
  6821. C  ***  HELIX  ***
  6822.  200  X(1) = -1.0
  6823.       X(2) = 0.0
  6824.       X(3) = 0.0
  6825.       GO TO 9999
  6826. C  *** SINGULAR  ***
  6827.  300  X(1) = 3.0
  6828.       X(2) = -1.0
  6829.       X(3) = 0.0
  6830.       X(4) = 1.0
  6831.       GO TO 9999
  6832. C  ***  WOODS  ***
  6833.  400  X(1) = -3.0
  6834.       X(2) = -1.0
  6835.       X(3) = -3.0
  6836.       X(4) = -1.0
  6837.       GO TO 9999
  6838. C  ***  ZANGWILL  ***
  6839.  500  X(1) = 1.0E2
  6840.       X(2) = -1.0
  6841.       X(3) = 2.5
  6842.       GO TO 9999
  6843. C  ***  ENGVALL  ***
  6844.  600  X(1) = 1.0
  6845.       X(2) = 2.0
  6846.       X(3) = 0.0
  6847.       GO TO 9999
  6848. C  *** BRANIN  ***
  6849.  700  X(1) = 2.0
  6850.       X(2) = 0.0
  6851.       GO TO 9999
  6852. C  ***  BEALE  ***
  6853.  800  X(1) = 1.0E-1
  6854.       X(2) = 1.0E-1
  6855.       GO TO 9999
  6856. C  *** CRAGG AND LEVY  ***
  6857.  900  X(1) = 1.0
  6858.       X(2) = 2.0
  6859.       X(3) = 2.0
  6860.       X(4) = 2.0
  6861.       GO TO 9999
  6862. C  ***  BOX  ***
  6863.  1000 X(1) = 0.0
  6864.       X(2) = 1.0E1
  6865.       X(3) = 2.0E1
  6866.       GO TO 9999
  6867. C  ***  DAVIDON 1  ***
  6868.  1100 DO 1101 I = 1,P
  6869.  1101    X(I) = 0.0
  6870.       GO TO 9999
  6871. C  ***  FREUDENSTEIN AND ROTH  ***
  6872.  1200 X(1) = 1.5E1
  6873.       X(2) = -2.0
  6874.       GO TO 9999
  6875. C  ***  WATSON  ***
  6876.  1300 CONTINUE
  6877.  1400 CONTINUE
  6878.  1500 CONTINUE
  6879.  1600 DO 1601 I = 1,P
  6880.  1601    X(I) = 0.0
  6881.       GO TO 9999
  6882. C  ***  CHEBYQUAD  ***
  6883.  1700 PP1INV = 1.0/FLOAT(P + 1)
  6884.       DO 1701 I = 1, P
  6885.  1701    X(I) = FLOAT(I)*PP1INV
  6886.       GO TO 9999
  6887. C  *** BROWN AND DENNIS  ***
  6888.  1800 X(1) = 2.5E1
  6889.       X(2) = 5.0
  6890.       X(3) = -5.0
  6891.       X(4) = -1.0
  6892.       GO TO 9999
  6893. C  ***  BARD  ***
  6894.  1900 X(1) = 1.
  6895.       X(2) = 1.
  6896.       X(3) = 1.
  6897.       GO TO 9999
  6898. C  ***  JENNRICH AND SAMPSON  ***
  6899.  2000 X(1) = 3.0E-1
  6900.       X(2) = 4.0E-1
  6901.       GO TO 9999
  6902. C  ***  KOWALIK AND OSBORNE  ***
  6903.  2100 X(1) = 2.5E-1
  6904.       X(2) = 3.9E-1
  6905.       X(3) = 4.15E-1
  6906.       X(4) = 3.9E-1
  6907.       GO TO 9999
  6908. C  ***  OSBORNE 1  ***
  6909.  2200 X(1) = 5.0E-1
  6910.       X(2) = 1.5
  6911.       X(3) = -1.0
  6912.       X(4) = 1.0E-2
  6913.       X(5) = 2.0E-2
  6914.       GO TO 9999
  6915. C  ***  OSBORNE 2  ***
  6916.  2300 X(1) = 1.3
  6917.       X(2) = 6.5E-1
  6918.       X(3) = 6.5E-1
  6919.       X(4) = 7.0E-1
  6920.       X(5) = 6.0E-1
  6921.       X(6) = 3.0
  6922.       X(7) = 5.0
  6923.       X(8) = 7.0
  6924.       X(9) = 2.0
  6925.       X(10) = 4.5
  6926.       X(11) = 5.5
  6927.       GO TO 9999
  6928. C  ***  MADSEN  ***
  6929.  2400 X(1) = 3.0
  6930.       X(2) = 1.0
  6931.       GO TO 9999
  6932. C  ***  MEYER  **
  6933.  2500 X(1) = 2.0E-2
  6934.       X(2) = 4.0E3
  6935.       X(3) = 2.5E2
  6936.       GO TO 9999
  6937. C  ***  BROWN  ***
  6938.  2600 CONTINUE
  6939.  2700 CONTINUE
  6940.  2800 CONTINUE
  6941.  2900 DO 2901 I = 1, P
  6942.  2901    X(I) = 5.E-1
  6943.       GO TO 9999
  6944. C
  6945. C
  6946.  9999 RETURN
  6947.       END
  6948. C///////////////////////////////////////////////////////////////////////
  6949. C     ***  TEST NL2SOL AND NL2SNO ON MADSEN EXAMPLE  ***                MAD00010
  6950.       INTEGER IV(62), UIPARM(1)
  6951.       DOUBLE PRECISION V(147), X(2), URPARM(1)
  6952.       EXTERNAL MADR, MADJ
  6953.       X(1) = 3.0D0
  6954.       X(2) = 1.0D0
  6955.       IV(1) = 0
  6956.       CALL NL2SOL(3, 2, X, MADR, MADJ, IV, V, UIPARM, URPARM, MADR)
  6957.       IV(1) = 12
  6958.       X(1) = 3.0D0
  6959.       X(2) = 1.0D0
  6960.       CALL NL2SNO(3, 2, X, MADR, IV, V, UIPARM, URPARM, MADR)
  6961.       STOP
  6962.       END
  6963.       SUBROUTINE MADR(N, P, X, NF, R, UIPARM, URPARM, UFPARM)
  6964.       INTEGER N, P, NF, UIPARM(1)
  6965.       DOUBLE PRECISION X(P), R(N), URPARM(1)
  6966.       EXTERNAL UFPARM
  6967.       R(1) = X(1)**2 + X(2)**2 + X(1)*X(2)
  6968.       R(2) = DSIN(X(1))
  6969.       R(3) = DCOS(X(2))
  6970.       RETURN
  6971.       END
  6972.       SUBROUTINE MADJ(N, P, X, NF, J, UIPARM, URPARM, UFPARM)
  6973.       INTEGER N, P, NF, UIPARM(1)
  6974.       DOUBLE PRECISION X(P), J(N,P), URPARM(1)
  6975.       EXTERNAL UFPARM
  6976.       J(1,1) = 2.0D0*X(1) + X(2)
  6977.       J(1,2) = 2.0D0*X(2) + X(1)
  6978.       J(2,1) = DCOS(X(1))
  6979.       J(2,2) = 0.0D0
  6980.       J(3,1) = 0.0D0
  6981.       J(3,2) = -DSIN(X(2))
  6982.       RETURN
  6983.       END
  6984. C///////////////////////////////////////////////////////////////////////
  6985.       INTEGER FUNCTION IMDCON(K)                                        IMD00010
  6986. C
  6987.       INTEGER K
  6988. C
  6989. C  ***  RETURN INTEGER MACHINE-DEPENDENT CONSTANTS  ***
  6990. C
  6991. C     ***  K = 1 MEANS RETURN STANDARD OUTPUT UNIT NUMBER.   ***
  6992. C     ***  K = 2 MEANS RETURN ALTERNATE OUTPUT UNIT NUMBER.  ***
  6993. C     ***  K = 3 MEANS RETURN  INPUT UNIT NUMBER.            ***
  6994. C          (NOTE -- K = 2, 3 ARE USED ONLY BY TEST PROGRAMS.)
  6995. C
  6996.       INTEGER MDCON(3)
  6997.       DATA MDCON(1)/6/, MDCON(2)/8/, MDCON(3)/5/
  6998. C
  6999.       IMDCON = MDCON(K)
  7000.       RETURN
  7001. C  ***  LAST CARD OF IMDCON FOLLOWS  ***
  7002.       END
  7003.       DOUBLE PRECISION FUNCTION RMDCON(K)                               RMD00010
  7004. C
  7005. C  ***  RETURN MACHINE DEPENDENT CONSTANTS USED BY NL2SOL  ***
  7006. C
  7007. C +++  COMMENTS BELOW CONTAIN DATA STATEMENTS FOR VARIOUS MACHINES.  +++
  7008. C +++  TO CONVERT TO ANOTHER MACHINE, PLACE A C IN COLUMN 1 OF THE   +++
  7009. C +++  DATA STATEMENT LINE(S) THAT CORRESPOND TO THE CURRENT MACHINE +++
  7010. C +++  AND REMOVE THE C FROM COLUMN 1 OF THE DATA STATEMENT LINE(S)  +++
  7011. C +++  THAT CORRESPOND TO THE NEW MACHINE.                           +++
  7012. C
  7013.       INTEGER K
  7014. C
  7015. C  ***  THE CONSTANT RETURNED DEPENDS ON K...
  7016. C
  7017. C  ***        K = 1... SMALLEST POS. ETA SUCH THAT -ETA EXISTS.
  7018. C  ***        K = 2... SQUARE ROOT OF 1.001*ETA.
  7019. C  ***        K = 3... UNIT ROUNDOFF = SMALLEST POS. NO. MACHEP SUCH
  7020. C  ***                 THAT 1 + MACHEP .GT. 1 .AND. 1 - MACHEP .LT. 1.
  7021. C  ***        K = 4... SQUARE ROOT OF 0.999*MACHEP.
  7022. C  ***        K = 5... SQUARE ROOT OF 0.999*BIG (SEE K = 6).
  7023. C  ***        K = 6... LARGEST MACHINE NO. BIG SUCH THAT -BIG EXISTS.
  7024. C
  7025.       DOUBLE PRECISION BIG, ETA, MACHEP
  7026. C/+
  7027.       DOUBLE PRECISION DSQRT
  7028. C/
  7029.       DOUBLE PRECISION ONE001, PT999
  7030. C
  7031.       DATA ONE001/1.001D0/, PT999/0.999D0/
  7032. C
  7033. C  +++  IBM 360, IBM 370, OR XEROX  +++
  7034. C
  7035.       DATA BIG/Z7FFFFFFFFFFFFFFF/, ETA/Z0010000000000000/,
  7036.      1     MACHEP/Z3410000000000000/
  7037. C
  7038. C  +++  DATA GENERAL  +++
  7039. C
  7040. C     DATA BIG/0.7237005577D+76/, ETA/0.5397605347D-78/,
  7041. C    1     MACHEP/2.22044605D-16/
  7042. C
  7043. C  +++  DEC 11  +++
  7044. C
  7045. C     DATA BIG/1.7D+38/, ETA/2.938735878D-39/, MACHEP/2.775557562D-17/
  7046. C
  7047. C  +++  HP3000  +++
  7048. C
  7049. C     DATA BIG/1.157920892D+77/, ETA/8.636168556D-78/,
  7050. C    1     MACHEP/5.551115124D-17/
  7051. C
  7052. C  +++  HONEYWELL  +++
  7053. C
  7054. C     DATA BIG/1.69D+38/, ETA/5.9D-39/, MACHEP/2.1680435D-19/
  7055. C
  7056. C  +++  DEC10  +++
  7057. C
  7058. C     DATA BIG/"377777100000000000000000/,
  7059. C    1     ETA/"002400400000000000000000/,
  7060. C    2     MACHEP/"104400000000000000000000/
  7061. C
  7062. C  +++  BURROUGHS  +++
  7063. C
  7064. C     DATA BIG/O0777777777777777,O7777777777777777/,
  7065. C    1     ETA/O1771000000000000,O7770000000000000/,
  7066. C    2     MACHEP/O1451000000000000,O0000000000000000/
  7067. C
  7068. C  +++  CONTROL DATA  +++
  7069. C
  7070. C
  7071. C     DATA BIG/37767777777777777777B,37167777777777777777B/,
  7072. C    1     ETA/00014000000000000000B,00000000000000000000B/,
  7073. C    2     MACHEP/15614000000000000000B,15010000000000000000B/
  7074. C
  7075. C  +++  PRIME  +++
  7076. C
  7077. C     DATA BIG/1.0D+9786/, ETA/1.0D-9860/, MACHEP/1.4210855D-14/
  7078. C
  7079. C  +++  UNIVAC  +++
  7080. C
  7081. C     DATA BIG/8.988D+307/, ETA/1.2D-308/, MACHEP/1.734723476D-18/
  7082. C
  7083. C  +++  VAX  +++
  7084. C
  7085. C     DATA BIG/1.7D+38/, ETA/2.939D-39/, MACHEP/1.3877788D-17/
  7086. C
  7087. C-------------------------------  BODY  --------------------------------
  7088. C
  7089.       GO TO (10, 20, 30, 40, 50, 60), K
  7090. C
  7091.  10   RMDCON = ETA
  7092.       GO TO 999
  7093. C
  7094.  20   RMDCON = DSQRT(ONE001*ETA)
  7095.       GO TO 999
  7096. C
  7097.  30   RMDCON = MACHEP
  7098.       GO TO 999
  7099. C
  7100.  40   RMDCON = DSQRT(PT999*MACHEP)
  7101.       GO TO 999
  7102. C
  7103.  50   RMDCON = DSQRT(PT999*BIG)
  7104.       GO TO 999
  7105. C
  7106.  60   RMDCON = BIG
  7107. C
  7108.  999  RETURN
  7109. C  ***  LAST CARD OF RMDCON FOLLOWS  ***
  7110.       END
  7111. C///////////////////////////////////////////////////////////////////////
  7112.       SUBROUTINE NL2SOL(N, P, X, CALCR, CALCJ, IV, V, UIPARM, URPARM,   NL200010
  7113.      1                  UFPARM)
  7114. C
  7115. C  ***  MINIMIZE NONLINEAR SUM OF SQUARES USING ANALYTIC JACOBIAN  ***
  7116. C  ***  (NL2SOL VERSION 2.2)  ***
  7117. C
  7118.       INTEGER N, P, IV(1), UIPARM(1)
  7119.       DOUBLE PRECISION X(P), V(1), URPARM(1)
  7120. C     DIMENSION IV(60+P),  V(93 + N*P + 3*N + P*(3*P+33)/2)
  7121. C     DIMENSION UIPARM(*), URPARM(*)
  7122.       EXTERNAL CALCR, CALCJ, UFPARM
  7123. C
  7124. C  ***  PURPOSE  ***
  7125. C
  7126. C        GIVEN A P-VECTOR X OF PARAMETERS, CALCR COMPUTES AN N-VECTOR
  7127. C     R = R(X) OF RESIDUALS CORRESPONDING TO X.  (R(X) PROBABLY ARISES
  7128. C     FROM A NONLINEAR MODEL INVOLVING P PARAMETERS AND N OBSERVATIONS.)
  7129. C     THIS ROUTINE INTERACTS WITH NL2ITR TO SEEK A PARAMETER VECTOR X
  7130. C     THAT MINIMIZES THE SUM OF THE SQUARES OF (THE COMPONENTS OF) R(X),
  7131. C     I.E., THAT MINIMIZES THE SUM-OF-SQUARES FUNCTION
  7132. C     F(X) = (R(X)**T) * R(X) / 2.  R(X) IS ASSUMED TO BE A TWICE CON-
  7133. C     TINUOUSLY DIFFERENTIABLE FUNCTION OF X.
  7134. C
  7135. C--------------------------  PARAMETER USAGE  --------------------------
  7136. C
  7137. C N........ (INPUT) THE NUMBER OF OBSERVATIONS, I.E., THE NUMBER OF
  7138. C                  COMPONENTS IN R(X).  N MUST BE .GE. P.
  7139. C P........ (INPUT) THE NUMBER OF PARAMETERS (COMPONENTS IN X).  P MUST
  7140. C                  BE POSITIVE.
  7141. C X........ (INPUT/OUTPUT).  ON INPUT, X IS AN INITIAL GUESS AT THE
  7142. C                  DESIRED PARAMETER ESTIMATE.  ON OUTPUT, X CONTAINS
  7143. C                  THE BEST PARAMETER ESTIMATE FOUND.
  7144. C CALCR.... (INPUT) A SUBROUTINE WHICH, GIVEN X, COMPUTES R(X).  CALCR
  7145. C                  MUST BE DECLARED EXTERNAL IN THE CALLING PROGRAM.
  7146. C                  IT IS INVOKED BY
  7147. C                       CALL CALCR(N,P,X,NF,R,UIPARM,URPARM,UFPARM)
  7148. C                  WHEN CALCR IS CALLED, NF IS THE INVOCATION COUNT
  7149. C                  FOR CALCR.  IT IS INCLUDED FOR POSSIBLE USE WITH
  7150. C                  CALCJ.  IF X IS OUT OF BOUNDS (E.G. IF IT WOULD
  7151. C                  CAUSE OVERFLOW IN COMPUTING R(X)), THEN CALCR SHOULD
  7152. C                  SET NF TO 0.  THIS WILL CAUSE A SHORTER STEP TO BE
  7153. C                  ATTEMPTED.  THE OTHER PARAMETERS ARE AS DESCRIBED
  7154. C                  ABOVE AND BELOW.  CALCR SHOULD NOT CHANGE N, P, OR X.
  7155. C CALCJ.... (INPUT) A SUBROUTINE WHICH, GIVEN X, COMPUTES THE JACOBIAN
  7156. C                  MATRIX J OF R AT X, I.E., THE N BY P MATRIX WHOSE
  7157. C                  (I,K) ENTRY IS THE PARTIAL DERIVATIVE OF THE I-TH
  7158. C                  COMPONENT OF R WITH RESPECT TO X(K).  CALCJ MUST BE
  7159. C                  DECLARED EXTERNAL IN THE CALLING PROGRAM.  IT IS
  7160. C                  INVOKED BY
  7161. C                       CALL CALCJ(N,P,X,NF,J,UIPARM,URPARM,UFPARM)
  7162. C                  NF IS THE INVOCATION COUNT FOR CALCR AT THE TIME
  7163. C                  R(X) WAS EVALUATED.  THE X PASSED TO CALCJ IS
  7164.  
  7165.  
  7166. C                  USUALLY THE ONE PASSED TO CALCR ON EITHER ITS MOST
  7167. C                  RECENT INVOCATION OR THE ONE PRIOR TO IT.  IF CALCR
  7168. C                  SAVES INTERMEDIATE RESULTS FOR USE BY CALCJ, THEN IT
  7169. C                  IS POSSIBLE TO TELL FROM NF WHETHER THEY ARE VALID
  7170. C                  FOR THE CURRENT X (OR WHICH COPY IS VALID IF TWO
  7171. C                  COPIES ARE KEPT).  IF J CANNOT BE COMPUTED AT X,
  7172. C                  THEN CALCJ SHOULD SET NF TO 0.  IN THIS CASE, NL2SOL
  7173. C                  WILL RETURN WITH IV(1) = 15.  THE OTHER PARAMETERS
  7174. C                  TO CALCJ ARE AS DESCRIBED ABOVE AND BELOW.  CALCJ
  7175. C                  SHOULD NOT CHANGE N, P, OR X.
  7176. C IV....... (INPUT/OUTPUT) AN INTEGER VALUE ARRAY OF LENGTH AT LEAST
  7177. C                  60 + P THAT HELPS CONTROL THE NL2SOL ALGORITHM AND
  7178. C                  THAT IS USED TO STORE VARIOUS INTERMEDIATE QUANTI-
  7179. C                  TIES.  OF PARTICULAR INTEREST ARE THE INITIALIZATION/
  7180. C                  RETURN CODE IV(1) AND THE ENTRIES IN IV THAT CONTROL
  7181. C                  PRINTING AND LIMIT THE NUMBER OF ITERATIONS AND FUNC-
  7182. C                  TION EVALUATIONS.  SEE THE SECTION ON IV INPUT
  7183. C                  VALUES BELOW.
  7184. C V........ (INPUT/OUTPUT) A FLOATING-POINT VALUE ARRAY OF LENGTH AT
  7185. C                  LEAST 93 + N*P + 3*N + P*(3*P+33)/2 THAT HELPS CON-
  7186. C                  TROL THE NL2SOL ALGORITHM AND THAT IS USED TO STORE
  7187. C                  VARIOUS INTERMEDIATE QUANTITIES.  OF PARTICULAR IN-
  7188. C                  TEREST ARE THE ENTRIES IN V THAT LIMIT THE LENGTH OF
  7189. C                  THE FIRST STEP ATTEMPTED (LMAX0), SPECIFY CONVER-
  7190. C                  GENCE TOLERANCES (AFCTOL, RFCTOL, XCTOL, XFTOL),
  7191. C                  AND HELP CHOOSE THE STEP SIZE USED IN COMPUTING THE
  7192. C                  COVARIANCE MATRIX (DELTA0).  SEE THE SECTION ON
  7193. C                  (SELECTED) V INPUT VALUES BELOW.
  7194. C UIPARM... (INPUT) USER INTEGER PARAMETER ARRAY PASSED WITHOUT CHANGE
  7195. C                  TO CALCR AND CALCJ.
  7196. C URPARM... (INPUT) USER FLOATING-POINT PARAMETER ARRAY PASSED WITHOUT
  7197. C                  CHANGE TO CALCR AND CALCJ.
  7198. C UFPARM... (INPUT) USER EXTERNAL SUBROUTINE OR FUNCTION PASSED WITHOUT
  7199. C                  CHANGE TO CALCR AND CALCJ.
  7200. C
  7201. C  ***  IV INPUT VALUES (FROM SUBROUTINE DFAULT)  ***
  7202. C
  7203. C IV(1)...  ON INPUT, IV(1) SHOULD HAVE A VALUE BETWEEN 0 AND 12......
  7204. C             0 AND 12 MEAN THIS IS A FRESH START.  0 MEANS THAT
  7205. C             DFAULT(IV, V) IS TO BE CALLED TO PROVIDE ALL DEFAULT
  7206. C             VALUES TO IV AND V.  12 (THE VALUE THAT DFAULT ASSIGNS TO
  7207. C             IV(1)) MEANS THE CALLER HAS ALREADY CALLED DFAULT(IV, V)
  7208. C             AND HAS POSSIBLY CHANGED SOME IV AND/OR V ENTRIES TO NON-
  7209. C             DEFAULT VALUES.  DEFAULT = 12.
  7210. C IV(COVPRT)... IV(14) = 1 MEANS PRINT A COVARIANCE MATRIX AT THE SOLU-
  7211. C             TION.  (THIS MATRIX IS COMPUTED JUST BEFORE A RETURN WITH
  7212. C             IV(1) = 3, 4, 5, 6.)
  7213. C             IV(COVPRT) = 0 MEANS SKIP THIS PRINTING.  DEFAULT = 1.
  7214. C IV(COVREQ)... IV(15) = NONZERO MEANS COMPUTE A COVARIANCE MATRIX
  7215. C             JUST BEFORE A RETURN WITH IV(1) = 3, 4, 5, 6.  IN
  7216. C             THIS CASE, AN APPROXIMATE COVARIANCE MATRIX IS OBTAINED
  7217. C             IN ONE OF SEVERAL WAYS.  LET K = ABS(IV(COVREQ)) AND LET
  7218. C             SCALE = 2*F(X)/MAX(1,N-P),  WHERE 2*F(X) IS THE RESIDUAL
  7219. C             SUM OF SQUARES.  IF K = 1 OR 2, THEN A FINITE-DIFFERENCE
  7220. C             HESSIAN APPROXIMATION H IS OBTAINED.  IF H IS POSITIVE
  7221. C             DEFINITE (OR, FOR K = 3, IF THE JACOBIAN MATRIX J AT X
  7222. C             IS NONSINGULAR), THEN ONE OF THE FOLLOWING IS COMPUTED...
  7223. C                  K = 1....  SCALE * H**-1 * (J**T * J) * H**-1.
  7224. C                  K = 2....  SCALE * H**-1.
  7225. C                  K = 3....  SCALE * (J**T * J)**-1.
  7226. C             (J**T IS THE TRANSPOSE OF J, WHILE **-1 MEANS INVERSE.)
  7227. C             IF IV(COVREQ) IS POSITIVE, THEN BOTH FUNCTION AND GRAD-
  7228. C             IENT VALUES (CALLS ON CALCR AND CALCJ) ARE USED IN COM-
  7229. C             PUTING H (WITH STEP SIZES DETERMINED USING V(DELTA0) --
  7230. C             SEE BELOW), WHILE IF IV(COVREQ) IS NEGATIVE, THEN ONLY
  7231. C             FUNCTION VALUES (CALLS ON CALCR) ARE USED (WITH STEP
  7232. C             SIZES DETERMINED USING V(DLTFDC) -- SEE BELOW).  IF
  7233. C             IV(COVREQ) = 0, THEN NO ATTEMPT IS MADE TO COMPUTE A CO-
  7234. C             VARIANCE MATRIX (UNLESS IV(COVPRT) = 1, IN WHICH CASE
  7235. C             IV(COVREQ) = 1 IS ASSUMED).  SEE IV(COVMAT) BELOW.
  7236. C             DEFAULT = 1.
  7237. C IV(DTYPE).... IV(16) TELLS HOW THE SCALE VECTOR D (SEE REF. 1) SHOULD
  7238. C             BE CHOSEN.  IV(DTYPE) .GE. 1 MEANS CHOOSE D AS DESCRIBED
  7239. C             BELOW WITH V(DFAC).  IV(DTYPE) .LE. 0 MEANS THE CALLER
  7240. C             HAS CHOSEN D AND HAS STORED IT IN V STARTING AT
  7241. C             V(94 + 2*N + P*(3*P + 31)/2).  DEFAULT = 1.
  7242. C IV(INITS).... IV(25) TELLS HOW THE S MATRIX (SEE REF. 1) SHOULD BE
  7243. C             INITIALIZED.  0 MEANS INITIALIZE S TO 0 (AND START WITH
  7244. C             THE GAUSS-NEWTON MODEL).  1 AND 2 MEAN THAT THE CALLER
  7245. C             HAS STORED THE LOWER TRIANGLE OF THE INITIAL S ROWWISE IN
  7246. C             V STARTING AT V(87+2*P).  IV(INITS) = 1 MEANS START WITH
  7247. C             THE GAUSS-NEWTON MODEL, WHILE IV(INITS) = 2 MEANS START
  7248. C             WITH THE AUGMENTED MODEL (SEE REF. 1).  DEFAULT = 0.
  7249. C IV(MXFCAL)... IV(17) GIVES THE MAXIMUM NUMBER OF FUNCTION EVALUATIONS
  7250. C             (CALLS ON CALCR, EXCLUDING THOSE USED TO COMPUTE THE CO-
  7251. C             VARIANCE MATRIX) ALLOWED.  IF THIS NUMBER DOES NOT SUF-
  7252. C             FICE, THEN NL2SOL RETURNS WITH IV(1) = 9.  DEFAULT = 200.
  7253. C IV(MXITER)... IV(18) GIVES THE MAXIMUM NUMBER OF ITERATIONS ALLOWED.
  7254. C             IT ALSO INDIRECTLY LIMITS THE NUMBER OF GRADIENT EVALUA-
  7255. C             TIONS (CALLS ON CALCJ, EXCLUDING THOSE USED TO COMPUTE
  7256. C             THE COVARIANCE MATRIX) TO IV(MXITER) + 1.  IF IV(MXITER)
  7257. C             ITERATIONS DO NOT SUFFICE, THEN NL2SOL RETURNS WITH
  7258. C             IV(1) = 10.  DEFAULT = 150.
  7259. C IV(OUTLEV)... IV(19) CONTROLS THE NUMBER AND LENGTH OF ITERATION SUM-
  7260. C             MARY LINES PRINTED (BY ITSMRY).  IV(OUTLEV) = 0 MEANS DO
  7261. C             NOT PRINT ANY SUMMARY LINES.  OTHERWISE, PRINT A SUMMARY
  7262. C             LINE AFTER EACH ABS(IV(OUTLEV)) ITERATIONS.  IF IV(OUTLEV)
  7263. C             IS POSITIVE, THEN SUMMARY LINES OF LENGTH 117 (PLUS CARRI-
  7264. C             AGE CONTROL) ARE PRINTED, INCLUDING THE FOLLOWING...  THE
  7265. C             ITERATION AND FUNCTION EVALUATION COUNTS, CURRENT FUNC-
  7266. C             TION VALUE (V(F) = HALF THE SUM OF SQUARES), RELATIVE
  7267. C             DIFFERENCE IN FUNCTION VALUES ACHIEVED BY THE LATEST STEP
  7268. C             (I.E., RELDF = (F0-V(F))/F0, WHERE F0 IS THE FUNCTION
  7269. C             VALUE FROM THE PREVIOUS ITERATION), THE RELATIVE FUNCTION
  7270. C             REDUCTION PREDICTED FOR THE STEP JUST TAKEN (I.E.,
  7271. C             PRELDF = V(PREDUC) / F0, WHERE V(PREDUC) IS DESCRIBED
  7272. C             BELOW), THE SCALED RELATIVE CHANGE IN X (SEE V(RELDX)
  7273. C             BELOW), THE MODELS USED IN THE CURRENT ITERATION (G =
  7274. C             GAUSS-NEWTON, S=AUGMENTED), THE MARQUARDT PARAMETER
  7275. C             STPPAR USED IN COMPUTING THE LAST STEP, THE SIZING FACTOR
  7276. C             USED IN UPDATING S, THE 2-NORM OF THE SCALE VECTOR D
  7277. C             TIMES THE STEP JUST TAKEN (SEE REF. 1), AND NPRELDF, I.E.,
  7278. C             V(NREDUC)/F0, WHERE V(NREDUC) IS DESCRIBED BELOW -- IF
  7279. C             NPRELDF IS POSITIVE, THEN IT IS THE RELATIVE FUNCTION
  7280. C             REDUCTION PREDICTED FOR A NEWTON STEP (ONE WITH
  7281. C             STPPAR = 0).  IF NPRELDF IS ZERO, EITHER THE GRADIENT
  7282. C             VANISHES (AS DOES PRELDF) OR ELSE THE AUGMENTED MODEL
  7283. C             IS BEING USED AND ITS HESSIAN IS INDEFINITE (WITH PRELDF
  7284. C             POSITIVE).  IF NPRELDF IS NEGATIVE, THEN IT IS THE NEGA-
  7285. C             OF THE RELATIVE FUNCTION REDUCTION PREDICTED FOR A STEP
  7286. C             COMPUTED WITH STEP BOUND V(LMAX0) FOR USE IN TESTING FOR
  7287. C             SINGULAR CONVERGENCE.
  7288. C                  IF IV(OUTLEV) IS NEGATIVE, THEN LINES OF MAXIMUM
  7289. C             LENGTH 79 (OR 55 IS IV(COVPRT) = 0) ARE PRINTED, INCLUD-
  7290. C             ING ONLY THE FIRST 6 ITEMS LISTED ABOVE (THROUGH RELDX).
  7291. C             DEFAULT = 1.
  7292. C IV(PARPRT)... IV(20) = 1 MEANS PRINT ANY NONDEFAULT V VALUES ON A
  7293. C             FRESH START OR ANY CHANGED V VALUES ON A RESTART.
  7294. C             IV(PARPRT) = 0 MEANS SKIP THIS PRINTING.  DEFAULT = 1.
  7295. C IV(PRUNIT)... IV(21) IS THE OUTPUT UNIT NUMBER ON WHICH ALL PRINTING
  7296. C             IS DONE.  IV(PRUNIT) = 0 MEANS SUPPRESS ALL PRINTING.
  7297. C             (SETTING IV(PRUNIT) TO 0 IS THE ONLY WAY TO SUPPRESS THE
  7298. C             ONE-LINE TERMINATION REASON MESSAGE PRINTED BY ITSMRY.)
  7299. C             DEFAULT = STANDARD OUTPUT UNIT (UNIT 6 ON MOST SYSTEMS).
  7300. C IV(SOLPRT)... IV(22) = 1 MEANS PRINT OUT THE VALUE OF X RETURNED (AS
  7301. C             WELL AS THE CORRESPONDING GRADIENT AND SCALE VECTOR D).
  7302. C             IV(SOLPRT) = 0 MEANS SKIP THIS PRINTING.  DEFAULT = 1.
  7303. C IV(STATPR)... IV(23) = 1 MEANS PRINT SUMMARY STATISTICS UPON RETURN-
  7304. C             ING.  THESE CONSIST OF THE FUNCTION VALUE (HALF THE SUM
  7305. C             OF SQUARES) AT X, V(RELDX) (SEE BELOW), THE NUMBER OF
  7306. C             FUNCTION AND GRADIENT EVALUATIONS (CALLS ON CALCR AND
  7307. C             CALCJ RESPECTIVELY, EXCLUDING ANY CALLS USED TO COMPUTE
  7308. C             THE COVARIANCE), THE RELATIVE FUNCTION REDUCTIONS PREDICT-
  7309. C             ED FOR THE LAST STEP TAKEN AND FOR A NEWTON STEP (OR PER-
  7310. C             HAPS A STEP BOUNDED BY V(LMAX0) -- SEE THE DESCRIPTIONS
  7311. C             OF PRELDF AND NPRELDF UNDER IV(OUTLEV) ABOVE), AND (IF AN
  7312. C             ATTEMPT WAS MADE TO COMPUTE THE COVARIANCE) THE NUMBER OF
  7313. C             CALLS ON CALCR AND CALCJ USED IN TRYING TO COMPUTE THE
  7314. C             COVARIANCE.  IV(STATPR) = 0 MEANS SKIP THIS PRINTING.
  7315. C             DEFAULT = 1.
  7316. C IV(X0PRT).... IV(24) = 1 MEANS PRINT THE INITIAL X AND SCALE VECTOR D
  7317. C             (ON A FRESH START ONLY).  IV(X0PRT) = 0 MEANS SKIP THIS
  7318. C             PRINTING.  DEFAULT = 1.
  7319. C
  7320. C  ***  (SELECTED) IV OUTPUT VALUES  ***
  7321. C
  7322. C IV(1)........ ON OUTPUT, IV(1) IS A RETURN CODE....
  7323. C             3 = X-CONVERGENCE.  THE SCALED RELATIVE DIFFERENCE BE-
  7324. C                  TWEEN THE CURRENT PARAMETER VECTOR X AND A LOCALLY
  7325. C                  OPTIMAL PARAMETER VECTOR IS VERY LIKELY AT MOST
  7326. C                  V(XCTOL).
  7327. C             4 = RELATIVE FUNCTION CONVERGENCE.  THE RELATIVE DIFFER-
  7328. C                  ENCE BETWEEN THE CURRENT FUNCTION VALUE AND ITS LO-
  7329. C                  CALLY OPTIMAL VALUE IS VERY LIKELY AT MOST V(RFCTOL).
  7330. C             5 = BOTH X- AND RELATIVE FUNCTION CONVERGENCE (I.E., THE
  7331. C                  CONDITIONS FOR IV(1) = 3 AND IV(1) = 4 BOTH HOLD).
  7332. C             6 = ABSOLUTE FUNCTION CONVERGENCE.  THE CURRENT FUNCTION
  7333. C                  VALUE IS AT MOST V(AFCTOL) IN ABSOLUTE VALUE.
  7334. C             7 = SINGULAR CONVERGENCE.  THE HESSIAN NEAR THE CURRENT
  7335. C                  ITERATE APPEARS TO BE SINGULAR OR NEARLY SO, AND A
  7336. C                  STEP OF LENGTH AT MOST V(LMAX0) IS UNLIKELY TO YIELD
  7337. C                  A RELATIVE FUNCTION DECREASE OF MORE THAN V(RFCTOL).
  7338. C             8 = FALSE CONVERGENCE.  THE ITERATES APPEAR TO BE CONVERG-
  7339. C                  ING TO A NONCRITICAL POINT.  THIS MAY MEAN THAT THE
  7340. C                  CONVERGENCE TOLERANCES (V(AFCTOL), V(RFCTOL),
  7341. C                  V(XCTOL)) ARE TOO SMALL FOR THE ACCURACY TO WHICH
  7342. C                  THE FUNCTION AND GRADIENT ARE BEING COMPUTED, THAT
  7343. C                  THERE IS AN ERROR IN COMPUTING THE GRADIENT, OR THAT
  7344. C                  THE FUNCTION OR GRADIENT IS DISCONTINUOUS NEAR X.
  7345. C             9 = FUNCTION EVALUATION LIMIT REACHED WITHOUT OTHER CON-
  7346. C                  VERGENCE (SEE IV(MXFCAL)).
  7347. C            10 = ITERATION LIMIT REACHED WITHOUT OTHER CONVERGENCE
  7348. C                  (SEE IV(MXITER)).
  7349. C            11 = STOPX RETURNED .TRUE. (EXTERNAL INTERRUPT).  SEE THE
  7350. C                  USAGE NOTES BELOW.
  7351. C            13 = F(X) CANNOT BE COMPUTED AT THE INITIAL X.
  7352. C            14 = BAD PARAMETERS PASSED TO ASSESS (WHICH SHOULD NOT
  7353. C                  OCCUR).
  7354. C            15 = THE JACOBIAN COULD NOT BE COMPUTED AT X (SEE CALCJ
  7355. C                  ABOVE).
  7356. C            16 = N OR P (OR PARAMETER NN TO NL2ITR) OUT OF RANGE --
  7357. C                  P .LE. 0 OR N .LT. P OR NN .LT. N.
  7358. C            17 = RESTART ATTEMPTED WITH N OR P (OR PAR. NN TO NL2ITR)
  7359. C                  CHANGED.
  7360. C            18 = IV(INITS) IS OUT OF RANGE.
  7361. C            19...45 = V(IV(1)) IS OUT OF RANGE.
  7362. C            50 = IV(1) WAS OUT OF RANGE.
  7363. C            87...(86+P) = JTOL(IV(1)-86) (I.E., V(IV(1)) IS NOT
  7364. C                  POSITIVE (SEE V(DFAC) BELOW).
  7365. C IV(COVMAT)... IV(26) TELLS WHETHER A COVARIANCE MATRIX WAS COMPUTED.
  7366. C             IF (IV(COVMAT) IS POSITIVE, THEN THE LOWER TRIANGLE OF
  7367. C             THE COVARIANCE MATRIX IS STORED ROWWISE IN V STARTING AT
  7368. C             V(IV(COVMAT)).  IF IV(COVMAT) = 0, THEN NO ATTEMPT WAS
  7369. C             MADE TO COMPUTE THE COVARIANCE.  IF IV(COVMAT) = -1,
  7370. C             THEN THE FINITE-DIFFERENCE HESSIAN WAS INDEFINITE.  AND
  7371. C             AND IF IV(COVMAT) = -2, THEN A SUCCESSFUL FINITE-DIFFER-
  7372. C             ENCING STEP COULD NOT BE FOUND FOR SOME COMPONENT OF X
  7373. C             (I.E., CALCR SET NF TO 0 FOR EACH OF TWO TRIAL STEPS).
  7374. C             NOTE THAT IV(COVMAT) IS RESET TO 0 AFTER EACH SUCCESSFUL
  7375. C             STEP, SO IF SUCH A STEP IS TAKEN AFTER A RESTART, THEN
  7376. C             THE COVARIANCE MATRIX WILL BE RECOMPUTED.
  7377. C IV(D)........ IV(27) IS THE STARTING SUBSCRIPT IN V OF THE CURRENT
  7378. C             SCALE VECTOR D.
  7379. C IV(G)........ IV(28) IS THE STARTING SUBSCRIPT IN V OF THE CURRENT
  7380. C             LEAST-SQUARES GRADIENT VECTOR (J**T)*R.
  7381. C IV(NFCALL)... IV(6) IS THE NUMBER OF CALLS SO FAR MADE ON CALCR (I.E.,
  7382. C             FUNCTION EVALUATIONS, INCLUDING THOSE USED IN COMPUTING
  7383. C             THE COVARIANCE).
  7384. C IV(NFCOV).... IV(40) IS THE NUMBER OF CALLS MADE ON CALCR WHEN
  7385. C             TRYING TO COMPUTE COVARIANCE MATRICES.
  7386. C IV(NGCALL)... IV(30) IS THE NUMBER OF GRADIENT EVALUATIONS (CALLS ON
  7387. C             CALCJ) SO FAR DONE (INCLUDING THOSE USED FOR COMPUTING
  7388. C             THE COVARIANCE).
  7389. C IV(NGCOV).... IV(41) IS THE NUMBER OF CALLS MADE ON CALCJ WHEN
  7390. C             TRYING TO COMPUTE COVARIANCE MATRICES.
  7391. C IV(NITER).... IV(31) IS THE NUMBER OF ITERATIONS PERFORMED.
  7392. C IV(R)........ IV(50) IS THE STARTING SUBSCRIPT IN V OF THE RESIDUAL
  7393. C             VECTOR R CORRESPONDING TO X.
  7394. C
  7395. C  ***  (SELECTED) V INPUT VALUES (FROM SUBROUTINE DFAULT)  ***
  7396. C
  7397. C V(AFCTOL)... V(31) IS THE ABSOLUTE FUNCTION CONVERGENCE TOLERANCE.
  7398. C             IF NL2SOL FINDS A POINT WHERE THE FUNCTION VALUE (HALF
  7399. C             THE SUM OF SQUARES) IS LESS THAN V(AFCTOL), AND IF NL2SOL
  7400. C             DOES NOT RETURN WITH IV(1) = 3, 4, OR 5, THEN IT RETURNS
  7401. C             WITH IV(1) = 6.  DEFAULT = MAX(10**-20, MACHEP**2), WHERE
  7402. C             MACHEP IS THE UNIT ROUNDOFF.
  7403. C V(DELTA0)... V(44) IS A FACTOR USED IN CHOOSING THE FINITE-DIFFERENCE
  7404. C             STEP SIZE USED IN COMPUTING THE COVARIANCE MATRIX WHEN
  7405. C             IV(COVREQ) = 1 OR 2.  FOR COMPONENT I, STEP SIZE
  7406. C                  V(DELTA0) * MAX(ABS(X(I)), 1/D(I)) * SIGN(X(I))
  7407. C             IS USED, WHERE D IS THE CURRENT SCALE VECTOR (SEE REF. 1).
  7408. C             (IF THIS STEP RESULTS IN CALCR SETTING NF TO 0, THEN -0.5
  7409. C             TIMES THIS STEP IS ALSO TRIED.)  DEFAULT = MACHEP**0.5,
  7410. C             WHERE MACHEP IS THE UNIT ROUNDOFF.
  7411. C V(DFAC)..... V(41) AND THE D0 AND JTOL ARRAYS (SEE V(D0INIT) AND
  7412. C             V(JTINIT)) ARE USED IN UPDATING THE SCALE VECTOR D WHEN
  7413. C             IV(DTYPE) .GT. 0.  (D IS INITIALIZED ACCORDING TO
  7414. C             V(DINIT).)  LET D1(I) =
  7415. C               MAX(SQRT(JCNORM(I)**2 + MAX(S(I,I),0)), V(DFAC)*D(I)),
  7416. C             WHERE JCNORM(I) IS THE 2-NORM OF THE I-TH COLUMN OF THE
  7417. C             CURRENT JACOBIAN MATRIX AND S IS THE S MATRIX OF REF. 1.
  7418. C             IF IV(DTYPE) = 1, THEN D(I) IS SET TO D1(I) UNLESS
  7419. C             D1(I) .LT. JTOL(I), IN WHICH CASE D(I) IS SET TO
  7420. C                                MAX(D0(I), JTOL(I)).
  7421. C             IF IV(DTYPE) .GE. 2, THEN D IS UPDATED DURING THE FIRST
  7422. C             ITERATION AS FOR IV(DTYPE) = 1 (AFTER ANY INITIALIZATION
  7423. C             DUE TO V(DINIT)) AND IS LEFT UNCHANGED THEREAFTER.
  7424. C             DEFAULT = 0.6.
  7425. C V(DINIT).... V(38), IF NONNEGATIVE, IS THE VALUE TO WHICH THE SCALE
  7426. C             VECTOR D IS INITIALIZED.  DEFAULT = 0.
  7427. C V(DLTFDC)... V(40) HELPS CHOOSE THE STEP SIZE USED WHEN COMPUTING THE
  7428. C             COVARIANCE MATRIX WHEN IV(COVREQ) = -1 OR -2.  FOR
  7429. C             DIFFERENCES INVOLVING X(I), THE STEP SIZE FIRST TRIED IS
  7430. C                       V(DLTFDC) * MAX(ABS(X(I)), 1/D(I)),
  7431. C             WHERE D IS THE CURRENT SCALE VECTOR (SEE REF. 1).  (IF
  7432. C             THIS STEP IS TOO BIG THE FIRST TIME IT IS TRIED, I.E., IF
  7433. C             CALCR SETS NF TO 0, THEN -0.5 TIMES THIS STEP IS ALSO
  7434. C             TRIED.)  DEFAULT = MACHEP**(1/3), WHERE MACHEP IS THE
  7435. C             UNIT ROUNDOFF.
  7436. C V(D0INIT)... V(37), IF POSITIVE, IS THE VALUE TO WHICH ALL COMPONENTS
  7437. C             OF THE D0 VECTOR (SEE V(DFAC)) ARE INITIALIZED.  IF
  7438. C             V(DFAC) = 0, THEN IT IS ASSUMED THAT THE CALLER HAS
  7439. C             STORED D0 IN V STARTING AT V(P+87).  DEFAULT = 1.0.
  7440. C V(JTINIT)... V(39), IF POSITIVE, IS THE VALUE TO WHICH ALL COMPONENTS
  7441. C             OF THE JTOL ARRAY (SEE V(DFAC)) ARE INITIALIZED.  IF
  7442. C             V(JTINIT) = 0, THEN IT IS ASSUMED THAT THE CALLER HAS
  7443. C             STORED JTOL IN V STARTING AT V(87).  DEFAULT = 10**-6.
  7444. C V(LMAX0).... V(35) GIVES THE MAXIMUM 2-NORM ALLOWED FOR D TIMES THE
  7445. C             VERY FIRST STEP THAT NL2SOL ATTEMPTS.  IT IS ALSO USED
  7446. C             IN TESTING FOR SINGULAR CONVERGENCE -- IF THE FUNCTION
  7447. C             REDUCTION PREDICTED FOR A STEP OF LENGTH BOUNDED BY
  7448. C             V(LMAX0) IS AT MOST V(RFCTOL) * ABS(F0), WHERE  F0  IS
  7449. C             THE FUNCTION VALUE AT THE START OF THE CURRENT ITERATION,
  7450. C             AND IF NL2SOL DOES NOT RETURN WITH IV(1) = 3, 4, 5, OR 6,
  7451. C             THEN IT RETURNS WITH IV(1) = 7.    DEFAULT = 100.
  7452. C V(RFCTOL)... V(32) IS THE RELATIVE FUNCTION CONVERGENCE TOLERANCE.
  7453. C             IF THE CURRENT MODEL PREDICTS A MAXIMUM POSSIBLE FUNCTION
  7454. C             REDUCTION (SEE V(NREDUC)) OF AT MOST V(RFCTOL)*ABS(F0) AT
  7455. C             THE START OF THE CURRENT ITERATION, WHERE  F0  IS THE
  7456. C             THEN CURRENT FUNCTION VALUE, AND IF THE LAST STEP ATTEMPT-
  7457. C             ED ACHIEVED NO MORE THAN TWICE THE PREDICTED FUNCTION
  7458. C             DECREASE, THEN NL2SOL RETURNS WITH IV(1) = 4 (OR 5).
  7459. C             DEFAULT = MAX(10**-10, MACHEP**(2/3)), WHERE MACHEP IS
  7460. C             THE UNIT ROUNDOFF.
  7461. C V(TUNER1)... V(26) HELPS DECIDE WHEN TO CHECK FOR FALSE CONVERGENCE
  7462. C             AND TO CONSIDER SWITCHING MODELS.  THIS IS DONE IF THE
  7463. C             ACTUAL FUNCTION DECREASE FROM THE CURRENT STEP IS NO MORE
  7464. C             THAN V(TUNER1) TIMES ITS PREDICTED VALUE.  DEFAULT = 0.1.
  7465. C V(XCTOL).... V(33) IS THE X-CONVERGENCE TOLERANCE.  IF A NEWTON STEP
  7466. C             (SEE V(NREDUC)) IS TRIED THAT HAS V(RELDX) .LE. V(XCTOL)
  7467. C             AND IF THIS STEP YIELDS AT MOST TWICE THE PREDICTED FUNC-
  7468. C             TION DECREASE, THEN NL2SOL RETURNS WITH IV(1) = 3 (OR 5).
  7469. C             (SEE THE DESCRIPTION OF V(RELDX) BELOW.)
  7470. C             DEFAULT = MACHEP**0.5, WHERE MACHEP IS THE UNIT ROUNDOFF.
  7471. C V(XFTOL).... V(34) IS THE FALSE CONVERGENCE TOLERANCE.  IF A STEP IS
  7472. C             TRIED THAT GIVES NO MORE THAN V(TUNER1) TIMES THE PREDICT-
  7473. C             ED FUNCTION DECREASE AND THAT HAS V(RELDX) .LE. V(XFTOL),
  7474. C             AND IF NL2SOL DOES NOT RETURN WITH IV(1) = 3, 4, 5, 6, OR
  7475. C             7, THEN IT RETURNS WITH IV(1) = 8.  (SEE THE DESCRIPTION
  7476. C             OF V(RELDX) BELOW.)  DEFAULT = 100*MACHEP, WHERE
  7477. C             MACHEP IS THE UNIT ROUNDOFF.
  7478. C V(*)........ DFAULT SUPPLIES TO V A NUMBER OF TUNING CONSTANTS, WITH
  7479. C             WHICH IT SHOULD ORDINARILY BE UNNECESSARY TO TINKER.  SEE
  7480. C             VERSION 2.2 OF THE NL2SOL USAGE SUMMARY (WHICH IS AN
  7481. C             APPENDIX TO REF. 1).
  7482. C
  7483. C  ***  (SELECTED) V OUTPUT VALUES  ***
  7484. C
  7485. C V(DGNORM)... V(1) IS THE 2-NORM OF (D**-1)*G, WHERE G IS THE MOST RE-
  7486. C             CENTLY COMPUTED GRADIENT AND D IS THE CORRESPONDING SCALE
  7487. C             VECTOR.
  7488. C V(DSTNRM)... V(2) IS THE 2-NORM OF D*STEP, WHERE STEP IS THE MOST RE-
  7489. C             CENTLY COMPUTED STEP AND D IS THE CURRENT SCALE VECTOR.
  7490. C V(F)........ V(10) IS THE CURRENT FUNCTION VALUE (HALF THE SUM OF
  7491. C             SQUARES).
  7492. C V(F0)....... V(13) IS THE FUNCTION VALUE AT THE START OF THE CURRENT
  7493. C             ITERATION.
  7494. C V(NREDUC)... V(6), IF POSITIVE, IS THE MAXIMUM FUNCTION REDUCTION
  7495. C             POSSIBLE ACCORDING TO THE CURRENT MODEL, I.E., THE FUNC-
  7496. C             TION REDUCTION PREDICTED FOR A NEWTON STEP (I.E.,
  7497. C             STEP = -H**-1 * G,  WHERE  G = (J**T) * R  IS THE CURRENT
  7498. C             GRADIENT AND H IS THE CURRENT HESSIAN APPROXIMATION --
  7499. C             H = (J**T)*J  FOR THE GAUSS-NEWTON MODEL AND
  7500. C             H = (J**T)*J + S  FOR THE AUGMENTED MODEL).
  7501. C                  V(NREDUC) = ZERO MEANS H IS NOT POSITIVE DEFINITE.
  7502. C                  IF V(NREDUC) IS NEGATIVE, THEN IT IS THE NEGATIVE OF
  7503. C             THE FUNCTION REDUCTION PREDICTED FOR A STEP COMPUTED WITH
  7504. C             A STEP BOUND OF V(LMAX0) FOR USE IN TESTING FOR SINGULAR
  7505. C             CONVERGENCE.
  7506. C V(PREDUC)... V(7) IS THE FUNCTION REDUCTION PREDICTED (BY THE CURRENT
  7507. C             QUADRATIC MODEL) FOR THE CURRENT STEP.  THIS (DIVIDED BY
  7508. C             V(F0)) IS USED IN TESTING FOR RELATIVE FUNCTION
  7509. C             CONVERGENCE.
  7510. C V(RELDX).... V(17) IS THE SCALED RELATIVE CHANGE IN X CAUSED BY THE
  7511. C             CURRENT STEP, COMPUTED AS
  7512. C                  MAX(ABS(D(I)*(X(I)-X0(I)), 1 .LE. I .LE. P) /
  7513. C                     MAX(D(I)*(ABS(X(I))+ABS(X0(I))), 1 .LE. I .LE. P),
  7514. C             WHERE X = X0 + STEP.
  7515. C
  7516. C-------------------------------  NOTES  -------------------------------
  7517. C
  7518. C  ***  ALGORITHM NOTES  ***
  7519. C
  7520. C        SEE REF. 1 FOR A DESCRIPTION OF THE ALGORITHM USED.
  7521. C        ON PROBLEMS WHICH ARE NATURALLY WELL SCALED, BETTER PERFORM-
  7522. C     ANCE MAY BE OBTAINED BY SETTING V(D0INIT) = 1.0 AND IV(DTYPE) = 0,
  7523. C     WHICH WILL CAUSE THE SCALE VECTOR D TO BE SET TO ALL ONES.
  7524. C
  7525. C  ***  USAGE NOTES  ***
  7526. C
  7527. C        AFTER A RETURN WITH IV(1) .LE. 11, IT IS POSSIBLE TO RESTART,
  7528. C     I.E., TO CHANGE SOME OF THE IV AND V INPUT VALUES DESCRIBED ABOVE
  7529. C     AND CONTINUE THE ALGORITHM FROM THE POINT WHERE IT WAS INTERRUPT-
  7530. C     ED.  IV(1) SHOULD NOT BE CHANGED, NOR SHOULD ANY ENTRIES OF IV
  7531. C     AND V OTHER THAN THE INPUT VALUES (THOSE SUPPLIED BY DFAULT).
  7532. C        THOSE WHO DO NOT WISH TO WRITE A CALCJ WHICH COMPUTES THE JA-
  7533. C     COBIAN MATRIX ANALYTICALLY SHOULD CALL NL2SNO RATHER THAN NL2SOL.
  7534. C     NL2SNO USES FINITE DIFFERENCES TO COMPUTE AN APPROXIMATE JACOBIAN.
  7535. C        THOSE WHO WOULD PREFER TO PROVIDE R AND J (THE RESIDUAL AND
  7536. C     JACOBIAN) BY REVERSE COMMUNICATION RATHER THAN BY WRITING SUBROU-
  7537. C     TINES CALCR AND CALCJ MAY CALL ON NL2ITR DIRECTLY.  SEE THE COM-
  7538. C     MENTS AT THE BEGINNING OF NL2ITR.
  7539. C        THOSE WHO USE NL2SOL INTERACTIVELY MAY WISH TO SUPPLY THEIR
  7540. C     OWN STOPX FUNCTION, WHICH SHOULD RETURN .TRUE. IF THE BREAK KEY
  7541. C     HAS BEEN PRESSED SINCE STOPX WAS LAST INVOKED.  THIS MAKES IT POS-
  7542. C     SIBLE TO EXTERNALLY INTERRUPT NL2SOL (WHICH WILL RETURN WITH
  7543. C     IV(1) = 11 IF STOPX RETURNS .TRUE.).
  7544. C        STORAGE FOR J IS ALLOCATED AT THE END OF V.  THUS THE CALLER
  7545. C     MAY MAKE V LONGER THAN SPECIFIED ABOVE AND MAY ALLOW CALCJ TO USE
  7546. C     ELEMENTS OF J BEYOND THE FIRST N*P AS SCRATCH STORAGE.
  7547. C
  7548. C  ***  PORTABILITY NOTES  ***
  7549. C
  7550. C        THE NL2SOL DISTRIBUTION TAPE CONTAINS BOTH SINGLE- AND DOUBLE-
  7551. C     PRECISION VERSIONS OF THE NL2SOL SOURCE CODE, SO IT SHOULD BE UN-
  7552. C     NECESSARY TO CHANGE PRECISIONS.
  7553. C        ONLY THE FUNCTIONS IMDCON AND RMDCON CONTAIN MACHINE-DEPENDENT
  7554. C     CONSTANTS.  TO CHANGE FROM ONE MACHINE TO ANOTHER, IT SHOULD
  7555. C     SUFFICE TO CHANGE THE (FEW) RELEVANT LINES IN THESE FUNCTIONS.
  7556. C        INTRINSIC FUNCTIONS ARE EXPLICITLY DECLARED.  ON CERTAIN COM-
  7557. C     PUTERS (E.G. UNIVAC), IT MAY BE NECESSARY TO COMMENT OUT THESE
  7558. C     DECLARATIONS.  SO THAT THIS MAY BE DONE AUTOMATICALLY BY A SIMPLE
  7559. C     PROGRAM, SUCH DECLARATIONS ARE PRECEDED BY A COMMENT HAVING C/+
  7560. C     IN COLUMNS 1-3 AND BLANKS IN COLUMNS 4-72 AND ARE FOLLOWED BY
  7561. C     A COMMENT HAVING C/ IN COLUMNS 1 AND 2 AND BLANKS IN COLUMNS 3-72.
  7562. C        THE NL2SOL SOURCE CODE IS EXPRESSED IN 1966 ANSI STANDARD
  7563. C     FORTRAN.  IT MAY BE CONVERTED TO FORTRAN 77 BY
  7564. C     COMMENTING OUT ALL LINES THAT FALL BETWEEN A LINE HAVING C/6 IN
  7565. C     COLUMNS 1-3 AND A LINE HAVING C/7 IN COLUMNS 1-3 AND BY REMOVING
  7566. C     (I.E., REPLACING BY A BLANK) THE C IN COLUMN 1 OF THE LINES THAT
  7567. C     FOLLOW THE C/7 LINE AND PRECEED A LINE HAVING C/ IN COLUMNS 1-2
  7568. C     AND BLANKS IN COLUMNS 3-72.  THESE CHANGES CONVERT SOME DATA
  7569. C     STATEMENTS INTO PARAMETER STATEMENTS, CONVERT SOME VARIABLES FROM
  7570. C     REAL TO CHARACTER*4, AND MAKE THE DATA STATEMENTS THAT INITIALIZE
  7571. C     THESE VARIABLES USE CHARACTER STRINGS DELIMITED BY PRIMES INSTEAD
  7572. C     OF HOLLERITH CONSTANTS.  (SUCH VARIABLES AND DATA STATEMENTS
  7573. C     APPEAR ONLY IN MODULES ITSMRY AND PARCHK.  PARAMETER STATEMENTS
  7574. C     APPEAR NEARLY EVERYWHERE.)
  7575. C
  7576. C  ***  REFERENCES  ***
  7577. C
  7578. C 1.  DENNIS, J.E., GAY, D.M., AND WELSCH, R.E. (1981), AN ADAPTIVE
  7579. C             NONLINEAR LEAST-SQUARES ALGORITHM, ACM TRANS. MATH.
  7580. C             SOFTWARE, VOL. 7, NO. 3.
  7581. C
  7582. C
  7583. C  ***  GENERAL  ***
  7584. C
  7585. C     CODED BY DAVID M. GAY (WINTER 1979 - WINTER 1980).
  7586. C     THIS SUBROUTINE WAS WRITTEN IN CONNECTION WITH RESEARCH
  7587. C     SUPPORTED BY THE NATIONAL SCIENCE FOUNDATION UNDER GRANTS
  7588. C     MCS-7600324, DCR75-10143, 76-14311DSS, MCS76-11989, AND
  7589. C     MCS-7906671.
  7590. C
  7591. C----------------------------  DECLARATIONS  ---------------------------
  7592. C
  7593.       EXTERNAL ITSMRY, NL2ITR
  7594. C ITSMRY... PRINTS ITERATION SUMMARY AND INFO ABOUT INITIAL AND FINAL X.
  7595. C NL2ITR... REVERSE-COMMUNICATION ROUTINE THAT CARRIES OUT NL2SOL ALGO-
  7596. C             RITHM.
  7597. C
  7598.       LOGICAL STRTED
  7599.       INTEGER D1, J1, NF, R1
  7600. C
  7601. C  ***  SUBSCRIPTS FOR IV AND V  ***
  7602. C
  7603.       INTEGER D, J, NFCALL, NFGCAL, R, TOOBIG
  7604. C
  7605. C  ***  IV SUBSCRIPT VALUES  ***
  7606. C
  7607. C/6
  7608.       DATA NFCALL/6/, NFGCAL/7/, TOOBIG/2/
  7609. C/7
  7610. C     PARAMETER (NFCALL=6, NFGCAL=7, TOOBIG=2)
  7611. C/
  7612. C
  7613. C  ***  V SUBSCRIPT VALUES  ***
  7614. C
  7615. C/6
  7616.       DATA D/27/, J/33/, R/50/
  7617. C/7
  7618. C     PARAMETER (D=27, J=33, R=50)
  7619. C/
  7620. C
  7621. C+++++++++++++++++++++++++++++++  BODY  ++++++++++++++++++++++++++++++++
  7622. C
  7623.       D1 = 94 + 2*N + P*(3*P + 31)/2
  7624.       IV(D) = D1
  7625.       R1 = D1 + P
  7626.       IV(R) = R1
  7627.       J1 = R1 + N
  7628.       IV(J) = J1
  7629.       STRTED = .TRUE.
  7630.       IF (IV(1) .NE. 0 .AND. IV(1) .NE. 12) GO TO 40
  7631.          STRTED = .FALSE.
  7632.          IV(NFCALL) = 1
  7633.          IV(NFGCAL) = 1
  7634. C
  7635.  10   NF = IV(NFCALL)
  7636.       CALL CALCR(N, P, X, NF, V(R1), UIPARM, URPARM, UFPARM)
  7637.       IF (STRTED) GO TO 20
  7638.          IF (NF .GT. 0) GO TO 30
  7639.               IV(1) = 13
  7640.               GO TO 60
  7641. C
  7642.  20   IF (NF .LE. 0) IV(TOOBIG) = 1
  7643.       GO TO 40
  7644. C
  7645.  30   CALL CALCJ(N, P, X, IV(NFGCAL), V(J1), UIPARM, URPARM, UFPARM)
  7646.       IF (IV(NFGCAL) .EQ. 0) GO TO 50
  7647.       STRTED = .TRUE.
  7648. C
  7649.  40   CALL NL2ITR(V(D1), IV, V(J1), N, N, P, V(R1), V, X)
  7650.       IF (IV(1) - 2) 10, 30, 999
  7651. C
  7652.  50   IV(1) = 15
  7653.  60   CALL ITSMRY(V(D1), IV, P, V, X)
  7654. C
  7655.  999  RETURN
  7656. C  ***  LAST CARD OF NL2SOL FOLLOWS  ***
  7657.       END
  7658.       SUBROUTINE NL2SNO(N, P, X, CALCR, IV, V, UIPARM, URPARM, UFPARM)  SNO00010
  7659. C
  7660. C  ***  LIKE NL2SOL, BUT WITHOUT CALCJ -- MINIMIZE NONLINEAR SUM OF  ***
  7661. C  ***  SQUARES USING FINITE-DIFFERENCE JACOBIAN APPROXIMATIONS      ***
  7662. C  ***  (NL2SOL VERSION 2.2)  ***
  7663. C
  7664.       INTEGER N, P, IV(1), UIPARM(1)
  7665.       DOUBLE PRECISION X(P), V(1), URPARM(1)
  7666. C     DIMENSION IV(60+P),  V(93 + N*P + 3*N + P*(3*P+33)/2)
  7667.       EXTERNAL CALCR, UFPARM
  7668. C
  7669. C-----------------------------  DISCUSSION  ----------------------------
  7670. C
  7671. C        THE PARAMETERS FOR NL2SNO ARE THE SAME AS THOSE FOR NL2SOL
  7672. C     (WHICH SEE), EXCEPT THAT CALCJ IS OMITTED.  INSTEAD OF CALLING
  7673. C     CALCJ TO OBTAIN THE JACOBIAN MATRIX OF R AT X, NL2SNO COMPUTES
  7674. C     AN APPROXIMATION TO IT BY FINITE (FORWARD) DIFFERENCES -- SEE
  7675. C     V(DLTFDJ) BELOW.  NL2SNO USES FUNCTION VALUES ONLY WHEN COMPUT-
  7676. C     THE COVARIANCE MATRIX (RATHER THAN THE FUNCTIONS AND GRADIENTS
  7677. C     THAT NL2SOL MAY USE).  TO DO SO, NL2SNO SETS IV(COVREQ) TO -1 IF
  7678. C     IV(COVPRT) = 1 WITH IV(COVREQ) = 0 AND TO MINUS ITS ABSOLUTE
  7679. C     VALUE OTHERWISE.  THUS V(DELTA0) IS NEVER REFERENCED AND ONLY
  7680. C     V(DLTFDC) MATTERS -- SEE NL2SOL FOR A DESCRIPTION OF V(DLTFDC).
  7681. C        THE NUMBER OF EXTRA CALLS ON CALCR USED IN COMPUTING THE JACO-
  7682. C     BIAN APPROXIMATION ARE NOT INCLUDED IN THE FUNCTION EVALUATION
  7683. C     COUNT IV(NFCALL) AND ARE NOT OTHERWISE REPORTED.
  7684. C
  7685. C V(DLTFDJ)... V(36) HELPS CHOOSE THE STEP SIZE USED WHEN COMPUTING THE
  7686. C             FINITE-DIFFERENCE JACOBIAN MATRIX.  FOR DIFFERENCES IN-
  7687. C             VOLVING X(I), THE STEP SIZE FIRST TRIED IS
  7688. C                       V(DLTFDJ) * MAX(ABS(X(I)), 1/D(I)),
  7689. C             WHERE D IS THE CURRENT SCALE VECTOR (SEE REF. 1).  (IF
  7690. C             THIS STEP IS TOO BIG, I.E., IF CALCR SETS NF TO 0, THEN
  7691. C             SMALLER STEPS ARE TRIED UNTIL THE STEP SIZE IS SHRUNK BE-
  7692. C             LOW 1000 * MACHEP, WHERE MACHEP IS THE UNIT ROUNDOFF.
  7693. C             DEFAULT = MACHEP**0.5.
  7694. C
  7695. C  ***  REFERENCES  ***
  7696. C
  7697. C 1.  DENNIS, J.E., GAY, D.M., AND WELSCH, R.E. (1981), AN ADAPTIVE
  7698. C             NONLINEAR LEAST-SQUARES ALGORITHM, ACM TRANS. MATH.
  7699. C             SOFTWARE, VOL. 7, NO. 3.
  7700. C
  7701. C  ***  GENERAL  ***
  7702. C
  7703. C     CODED BY DAVID M. GAY.
  7704. C     THIS SUBROUTINE WAS WRITTEN IN CONNECTION WITH RESEARCH
  7705. C     SUPPORTED BY THE NATIONAL SCIENCE FOUNDATION UNDER GRANTS
  7706. C     MCS-7600324, DCR75-10143, 76-14311DSS, MCS76-11989, AND
  7707. C     MCS-7906671.
  7708. C
  7709. C+++++++++++++++++++++++++++  DECLARATIONS  ++++++++++++++++++++++++++++
  7710. C
  7711. C  ***  INTRINSIC FUNCTIONS  ***
  7712. C/+
  7713.       INTEGER IABS
  7714.       DOUBLE PRECISION DABS, DMAX1
  7715. C/
  7716. C  ***  EXTERNAL FUNCTIONS AND SUBROUTINES  ***
  7717. C
  7718.       EXTERNAL DFAULT, ITSMRY, NL2ITR, RMDCON, VSCOPY
  7719.       DOUBLE PRECISION RMDCON
  7720. C
  7721. C DFAULT... SUPPLIES DEFAULT PARAMETER VALUES.
  7722. C ITSMRY... PRINTS ITERATION SUMMARY AND INFO ABOUT INITIAL AND FINAL X.
  7723. C NL2ITR... REVERSE-COMMUNICATION ROUTINE THAT CARRIES OUT NL2SOL ALGO-
  7724. C             RITHM.
  7725. C RMDCON... RETURNS MACHINE-DEPENDENT CONSTANTS.
  7726. C VSCOPY... SETS ALL ELEMENTS OF A VECTOR TO A SCALAR.
  7727. C
  7728.       LOGICAL STRTED
  7729.       INTEGER DK, D1, I, J1, J1K, K, NF, RN, R1, DINIT
  7730.       DOUBLE PRECISION H, HFAC, HLIM, NEGPT5, ONE, XK, ZERO
  7731. C
  7732. C  ***  SUBSCRIPTS FOR IV AND V  ***
  7733. C
  7734.       INTEGER COVPRT, COVREQ, D, DLTFDJ, DTYPE, J, NFCALL, NFGCAL, R,
  7735.      1        TOOBIG
  7736. C
  7737. C/6
  7738.       DATA HFAC/1.D+3/, NEGPT5/-0.5D+0/, ONE/1.D+0/, ZERO/0.D+0/
  7739. C/7
  7740. C     PARAMETER (HFAC=1.D+3, NEGPT5=-0.5D+0, ONE=1.D+0, ZERO=0.D+0)
  7741. C/
  7742. C
  7743. C  ***  IV SUBSCRIPT VALUES  ***
  7744. C
  7745. C/6
  7746.       DATA COVPRT/14/, COVREQ/15/, D/27/, DTYPE/16/, J/33/,
  7747.      1     NFCALL/6/, NFGCAL/7/, R/50/, TOOBIG/2/
  7748. C/7
  7749. C     PARAMETER (COVPRT=14, COVREQ=15, D=27, DTYPE=16, J=33,
  7750. C    1     NFCALL=6, NFGCAL=7, R=50, TOOBIG=2)
  7751. C/
  7752. C
  7753. C  ***  V SUBSCRIPT VALUES  ***
  7754. C
  7755. C/6
  7756.       DATA DLTFDJ/36/, DINIT/38/
  7757. C/7
  7758. C     PARAMETER (DLTFDJ=36)
  7759. C     SAVE HLIM
  7760. C/
  7761.       DATA HLIM/0.D+0/
  7762. C
  7763. C+++++++++++++++++++++++++++++++  BODY  ++++++++++++++++++++++++++++++++
  7764. C
  7765.       D1 = 94 + 2*N + P*(3*P + 31)/2
  7766.       IV(D) = D1
  7767.       R1 = D1 + P
  7768.       IV(R) = R1
  7769.       J1 = R1 + N
  7770.       IV(J) = J1
  7771.       RN = J1 - 1
  7772.       IF (IV(1) .EQ. 0) CALL DFAULT(IV, V)
  7773.       IV(COVREQ) = -IABS(IV(COVREQ))
  7774.       IF (IV(COVPRT) .NE. 0 .AND. IV(COVREQ) .EQ. 0) IV(COVREQ) = -1
  7775.       STRTED = .TRUE.
  7776.       IF (IV(1) .NE. 12) GO TO 80
  7777.          STRTED = .FALSE.
  7778.          IV(NFCALL) = 1
  7779.          IV(NFGCAL) = 1
  7780. C        ***  INITIALIZE SCALE VECTOR D TO ONES FOR COMPUTING
  7781. C        ***  INITIAL JACOBIAN.
  7782.          IF (IV(DTYPE) .GT. 0) CALL VSCOPY(P, V(D1), ONE)
  7783.        IF (V(DINIT).GT.ZERO) CALL VSCOPY(P, V(D1), V(DINIT))
  7784. C
  7785.  10   NF = IV(NFCALL)
  7786.       CALL CALCR(N, P, X, NF, V(R1), UIPARM, URPARM, UFPARM)
  7787.       IF (STRTED) GO TO 20
  7788.          IF (NF .GT. 0) GO TO 30
  7789.               IV(1) = 13
  7790.               GO TO 90
  7791. C
  7792.  20   IF (NF .LE. 0) IV(TOOBIG) = 1
  7793.       GO TO 80
  7794. C
  7795. C  ***  COMPUTE FINITE-DIFFERENCE JACOBIAN  ***
  7796. C
  7797.  30   J1K = J1
  7798.       DK = D1
  7799.       DO 70 K = 1, P
  7800.          XK = X(K)
  7801.          H = V(DLTFDJ) * DMAX1(DABS(XK), ONE/V(DK))
  7802.          DK = DK + 1
  7803.  40      X(K) = XK + H
  7804.          NF = IV(NFGCAL)
  7805.          CALL CALCR (N, P, X, NF, V(J1K), UIPARM, URPARM, UFPARM)
  7806.          IF (NF .GT. 0) GO TO 50
  7807.               IF (HLIM .EQ. ZERO) HLIM = HFAC * RMDCON(3)
  7808. C             ***  HLIM = HFAC TIMES THE UNIT ROUNDOFF  ***
  7809.               H = NEGPT5 * H
  7810.               IF (DABS(H) .GE. HLIM) GO TO 40
  7811.                    IV(1) = 15
  7812.                    GO TO 90
  7813.  50      X(K) = XK
  7814.          DO 60 I = R1, RN
  7815.               V(J1K) = (V(J1K) - V(I)) / H
  7816.               J1K = J1K + 1
  7817.  60           CONTINUE
  7818.  70      CONTINUE
  7819. C
  7820.       STRTED = .TRUE.
  7821. C
  7822.  80   CALL NL2ITR(V(D1), IV, V(J1), N, N, P, V(R1), V, X)
  7823.       IF (IV(1) - 2) 10, 30, 999
  7824. C
  7825.  90   CALL ITSMRY(V(D1), IV, P, V, X)
  7826. C
  7827.  999  RETURN
  7828. C  ***  LAST CARD OF NL2SNO FOLLOWS  ***
  7829.       END
  7830.       SUBROUTINE NL2ITR (D, IV, J, N, NN, P, R, V, X)                   ITR00010
  7831. C
  7832. C  ***  CARRY OUT NL2SOL (NONLINEAR LEAST-SQUARES) ITERATIONS  ***
  7833. C  ***  (NL2SOL VERSION 2.2)  ***
  7834. C
  7835. C  ***  PARAMETER DECLARATIONS  ***
  7836. C
  7837.       INTEGER IV(1), N, NN, P
  7838.       DOUBLE PRECISION D(P), J(NN,P), R(N), V(1), X(P)
  7839. C     DIMENSION IV(60+P), V(93 + 2*N + P*(3*P+31)/2)
  7840. C
  7841. C
  7842. C--------------------------  PARAMETER USAGE  --------------------------
  7843. C
  7844. C D.... SCALE VECTOR.
  7845. C IV... INTEGER VALUE ARRAY.
  7846. C J.... N BY P JACOBIAN MATRIX (LEAD DIMENSION NN).
  7847. C N.... NUMBER OF OBSERVATIONS (COMPONENTS IN R).
  7848. C NN... LEAD DIMENSION OF J.
  7849. C P.... NUMBER OF PARAMETERS (COMPONENTS IN X).
  7850. C R.... RESIDUAL VECTOR.
  7851. C V.... FLOATING-POINT VALUE ARRAY.
  7852. C X.... PARAMETER VECTOR.
  7853. C
  7854. C  ***  DISCUSSION  ***
  7855. C
  7856. C        PARAMETERS IV, N, P, V, AND X ARE THE SAME AS THE CORRESPOND-
  7857. C     ING ONES TO NL2SOL (WHICH SEE), EXCEPT THAT V CAN BE SHORTER
  7858. C     (SINCE THE PART OF V THAT NL2SOL USES FOR STORING D, J, AND R IS
  7859. C     NOT NEEDED).  MOREOVER, COMPARED WITH NL2SOL, IV(1) MAY HAVE THE
  7860. C     TWO ADDITIONAL OUTPUT VALUES 1 AND 2, WHICH ARE EXPLAINED BELOW,
  7861. C     AS IS THE USE OF IV(TOOBIG) AND IV(NFGCAL).  THE VALUES IV(D),
  7862. C     IV(J), AND IV(R), WHICH ARE OUTPUT VALUES FROM NL2SOL (AND
  7863. C     NL2SNO), ARE NOT REFERENCED BY NL2ITR OR THE SUBROUTINES IT CALLS.
  7864. C        ON A FRESH START, I.E., A CALL ON NL2ITR WITH IV(1) = 0 OR 12,
  7865. C     NL2ITR ASSUMES THAT R = R(X), THE RESIDUAL AT X, AND J = J(X),
  7866. C     THE CORRESPONDING JACOBIAN MATRIX OF R AT X.
  7867. C
  7868. C IV(1) = 1 MEANS THE CALLER SHOULD SET R TO R(X), THE RESIDUAL AT X,
  7869. C             AND CALL NL2ITR AGAIN, HAVING CHANGED NONE OF THE OTHER
  7870. C             PARAMETERS.  AN EXCEPTION OCCURS IF R CANNOT BE EVALUATED
  7871. C             AT X (E.G. IF R WOULD OVERFLOW), WHICH MAY HAPPEN BECAUSE
  7872. C             OF AN OVERSIZED STEP.  IN THIS CASE THE CALLER SHOULD SET
  7873. C             IV(TOOBIG) = IV(2) TO 1, WHICH WILL CAUSE NL2ITR TO IG-
  7874. C             NORE R AND TRY A SMALLER STEP.  THE PARAMETER NF THAT
  7875. C             NL2SOL PASSES TO CALCR (FOR POSSIBLE USE BY CALCJ) IS A
  7876. C             COPY OF IV(NFCALL) = IV(6).
  7877. C IV(1) = 2 MEANS THE CALLER SHOULD SET J TO J(X), THE JACOBIAN MATRIX
  7878. C             OF R AT X, AND CALL NL2ITR AGAIN.  THE CALLER MAY CHANGE
  7879. C             D AT THIS TIME, BUT SHOULD NOT CHANGE ANY OF THE OTHER
  7880. C             PARAMETERS.  THE PARAMETER NF THAT NL2SOL PASSES TO
  7881. C             CALCJ IS IV(NFGCAL) = IV(7).  IF J CANNOT BE EVALUATED
  7882. C             AT X, THEN THE CALLER MAY SET IV(NFGCAL) TO 0, IN WHICH
  7883. C             CASE NL2ITR WILL RETURN WITH IV(1) = 15.
  7884. C
  7885. C  ***  GENERAL  ***
  7886. C
  7887. C     CODED BY DAVID M. GAY.
  7888. C     THIS SUBROUTINE WAS WRITTEN IN CONNECTION WITH RESEARCH
  7889. C     SUPPORTED BY THE NATIONAL SCIENCE FOUNDATION UNDER GRANTS
  7890. C
  7891. C     MCS-7600324, DCR75-10143, 76-14311DSS, MCS76-11989, AND
  7892. C     MCS-7906671.
  7893. C        (SEE NL2SOL FOR REFERENCES.)
  7894. C
  7895. C+++++++++++++++++++++++++++  DECLARATIONS  ++++++++++++++++++++++++++++
  7896. C
  7897. C  ***  LOCAL VARIABLES  ***
  7898. C
  7899.       INTEGER DUMMY, DIG1, G1, G01, H0, H1, I, IM1, IPIVI, IPIVK, IPIV1,
  7900.      1        IPK, K, KM1, L, LKY1, LMAT1, LSTGST, M, PP1O2, QTR1,
  7901.      2        RDK, RD0, RD1, RSAVE1, SMH, SSTEP, STEP1, STPMOD, S1,
  7902.      3        TEMP1, TEMP2, W1, X01
  7903.       DOUBLE PRECISION E, RDOF1, STTSST, T, T1
  7904. C
  7905. C     ***  CONSTANTS  ***
  7906. C
  7907.       DOUBLE PRECISION HALF, NEGONE, ONE, ZERO
  7908. C
  7909. C  ***  INTRINSIC FUNCTIONS  ***
  7910. C/+
  7911.       INTEGER IABS
  7912.       DOUBLE PRECISION DABS
  7913. C/
  7914. C  ***  EXTERNAL FUNCTIONS AND SUBROUTINES  ***
  7915. C
  7916.       EXTERNAL ASSESS, COVCLC, DOTPRD, DUPDAT, GQTSTP, ITSMRY, LMSTEP,
  7917.      1         PARCHK, QAPPLY, QRFACT, RPTMUL, SLUPDT, SLVMUL, STOPX,
  7918.      2         VAXPY, VCOPY, VSCOPY, V2NORM
  7919.       LOGICAL STOPX
  7920.       DOUBLE PRECISION DOTPRD, V2NORM
  7921. C
  7922. C ASSESS... ASSESSES CANDIDATE STEP.
  7923. C COVCLC... COMPUTES COVARIANCE MATRIX.
  7924. C DOTPRD... RETURNS INNER PRODUCT OF TWO VECTORS.
  7925. C DUPDAT... UPDATES SCALE VECTOR D.
  7926. C GQTSTP... COMPUTES GOLDFELD-QUANDT-TROTTER STEP (AUGMENTED MODEL).
  7927. C ITSMRY... PRINTS ITERATION SUMMARY AND INFO ABOUT INITIAL AND FINAL X.
  7928. C LMSTEP... COMPUTES LEVENBERG-MARQUARDT STEP (GAUSS-NEWTON MODEL).
  7929. C PARCHK... CHECKS VALIDITY OF INPUT IV AND V VALUES.
  7930. C QAPPLY... APPLIES ORTHOGONAL MATRIX Q FROM QRFACT TO A VECTOR.
  7931. C QRFACT... COMPUTES QR DECOMPOSITION OF A MATRIX VIA HOUSEHOLDER TRANS.
  7932. C RPTMUL... MULTIPLIES VECTOR BY THE R MATRIX (AND/OR ITS TRANSPOSE)
  7933. C             STORED BY QRFACT.
  7934. C SLUPDT... PERFORMS QUASI-NEWTON UPDATE ON COMPACTLY STORED LOWER TRI-
  7935. C             ANGLE OF A SYMMETRIC MATRIX.
  7936. C STOPX.... RETURNS .TRUE. IF THE BREAK KEY HAS BEEN PRESSED.
  7937. C VAXPY.... COMPUTES SCALAR TIMES ONE VECTOR PLUS ANOTHER.
  7938. C VCOPY.... COPIES ONE VECTOR TO ANOTHER.
  7939. C VSCOPY... SETS ALL ELEMENTS OF A VECTOR TO A SCALAR.
  7940. C V2NORM... RETURNS THE 2-NORM OF A VECTOR.
  7941. C
  7942. C  ***  SUBSCRIPTS FOR IV AND V  ***
  7943. C
  7944.       INTEGER CNVCOD, COSMIN, COVMAT, COVPRT, COVREQ, DGNORM, DIG,
  7945.      1        DINIT, DSTNRM, DTYPE, D0INIT, F, FDIF, FUZZ,
  7946.      2        F0, G, GTSTEP, H, IERR, INCFAC, INITS, IPIVOT, IPIV0, IRC,
  7947.      3        JTINIT, JTOL1, KAGQT, KALM, LKY, LMAT, LMAX0, MODE, MODEL,
  7948.      4        MXFCAL, MXITER, NFCALL, NFGCAL, NFCOV, NGCOV, NGCALL,
  7949.      5        NITER, NVSAVE, PHMXFC, PREDUC, QTR, RADFAC, RADINC,
  7950.      6        RADIUS, RAD0, RD, RESTOR, RLIMIT, RSAVE, S, SIZE, STEP,
  7951.      7        STGLIM, STLSTG, STPPAR, SUSED, SWITCH, TOOBIG, TUNER4,
  7952.      8        TUNER5, VSAVE1, W, WSCALE, XIRC, X0
  7953. C
  7954. C  ***  IV SUBSCRIPT VALUES  ***
  7955. C
  7956. C/6
  7957.       DATA CNVCOD/34/, COVMAT/26/, COVPRT/14/,
  7958.      1     COVREQ/15/, DIG/43/, DTYPE/16/, G/28/, H/44/,
  7959.      2     IERR/32/, INITS/25/, IPIVOT/61/, IPIV0/60/,
  7960.      3     IRC/3/, KAGQT/35/, KALM/36/, LKY/37/, LMAT/58/,
  7961.      4     MODE/38/, MODEL/5/, MXFCAL/17/, MXITER/18/,
  7962.      5     NFCALL/6/, NFGCAL/7/, NFCOV/40/, NGCOV/41/,
  7963.      6     NGCALL/30/, NITER/31/, QTR/49/,
  7964.      7     RADINC/8/, RD/51/, RESTOR/9/, RSAVE/52/, S/53/,
  7965.      8     STEP/55/, STGLIM/11/, STLSTG/56/, SUSED/57/,
  7966.      9     SWITCH/12/, TOOBIG/2/, W/59/, XIRC/13/, X0/60/
  7967. C/7
  7968. C     PARAMETER (CNVCOD=34, COVMAT=26, COVPRT=14,
  7969. C    1     COVREQ=15, DIG=43, DTYPE=16, G=28, H=44,
  7970. C    2     IERR=32, INITS=25, IPIVOT=61, IPIV0=60,
  7971. C    3     IRC=3, KAGQT=35, KALM=36, LKY=37, LMAT=58,
  7972. C    4     MODE=38, MODEL=5, MXFCAL=17, MXITER=18,
  7973. C    5     NFCALL=6, NFGCAL=7, NFCOV=40, NGCOV=41,
  7974. C    6     NGCALL=30, NITER=31, QTR=49,
  7975. C    7     RADINC=8, RD=51, RESTOR=9, RSAVE=52, S=53,
  7976. C    8     STEP=55, STGLIM=11, STLSTG=56, SUSED=57,
  7977. C    9     SWITCH=12, TOOBIG=2, W=59, XIRC=13, X0=60)
  7978. C/
  7979. C
  7980. C  ***  V SUBSCRIPT VALUES  ***
  7981. C
  7982. C/6
  7983.       DATA COSMIN/43/, DGNORM/1/, DINIT/38/, DSTNRM/2/,
  7984.      1     D0INIT/37/, F/10/, FDIF/11/, FUZZ/45/,
  7985.      2     F0/13/, GTSTEP/4/, INCFAC/23/,
  7986.      3     JTINIT/39/, JTOL1/87/, LMAX0/35/,
  7987.      4     NVSAVE/9/, PHMXFC/21/, PREDUC/7/,
  7988.      5     RADFAC/16/, RADIUS/8/, RAD0/9/, RLIMIT/42/,
  7989.      6     SIZE/47/, STPPAR/5/, TUNER4/29/, TUNER5/30/,
  7990.      7     VSAVE1/78/, WSCALE/48/
  7991. C/7
  7992. C     PARAMETER (COSMIN=43, DGNORM=1, DINIT=38, DSTNRM=2,
  7993. C    1     D0INIT=37, F=10, FDIF=11, FUZZ=45,
  7994. C    2     F0=13, GTSTEP=4, INCFAC=23,
  7995. C    3     JTINIT=39, JTOL1=87, LMAX0=35,
  7996. C    4     NVSAVE=9, PHMXFC=21, PREDUC=7,
  7997. C    5     RADFAC=16, RADIUS=8, RAD0=9, RLIMIT=42,
  7998. C    6     SIZE=47, STPPAR=5, TUNER4=29, TUNER5=30,
  7999. C    7     VSAVE1=78, WSCALE=48)
  8000. C/
  8001. C
  8002. C
  8003. C/6
  8004.       DATA HALF/0.5D+0/, NEGONE/-1.D+0/, ONE/1.D+0/, ZERO/0.D+0/
  8005. C/7
  8006. C     PARAMETER (HALF=0.5D+0, NEGONE=-1.D+0, ONE=1.D+0, ZERO=0.D+0)
  8007. C/
  8008. C
  8009. C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  8010. C
  8011.       I = IV(1)
  8012.       IF (I .EQ. 1) GO TO 20
  8013.       IF (I .EQ. 2) GO TO 50
  8014. C
  8015. C  ***  CHECK VALIDITY OF IV AND V INPUT VALUES  ***
  8016. C
  8017. C     ***  NOTE -- IF IV(1) = 0, THEN PARCHK CALLS DFAULT(IV, V)  ***
  8018.       CALL PARCHK(IV, N, NN, P, V)
  8019.       I = IV(1) - 2
  8020.       IF (I .GT. 10) GO TO 999
  8021.       GO TO (350, 350, 350, 350, 350, 350, 195, 160, 195, 10), I
  8022. C
  8023. C  ***  INITIALIZATION AND STORAGE ALLOCATION  ***
  8024. C
  8025.  10   IV(NITER) = 0
  8026.       IV(NFCALL) = 1
  8027.       IV(NGCALL) = 1
  8028.       IV(NFGCAL) = 1
  8029.       IV(MODE) = -1
  8030.       IV(STGLIM) = 2
  8031.       IV(TOOBIG) = 0
  8032.       IV(CNVCOD) = 0
  8033.       IV(COVMAT) = 0
  8034.       IV(NFCOV) = 0
  8035.       IV(NGCOV) = 0
  8036.       IV(KALM) = -1
  8037.       IV(RADINC) = 0
  8038.       IV(S) = JTOL1 + 2*P
  8039.       PP1O2 = P * (P + 1) / 2
  8040.       IV(X0) = IV(S) + PP1O2
  8041.       IV(STEP) = IV(X0) + P
  8042.       IV(STLSTG) = IV(STEP) + P
  8043.       IV(DIG) = IV(STLSTG) + P
  8044.       IV(G) = IV(DIG) + P
  8045.       IV(LKY) = IV(G) + P
  8046.       IV(RD) = IV(LKY) + P
  8047.       IV(RSAVE) = IV(RD) + P
  8048.       IV(QTR) = IV(RSAVE) + N
  8049.       IV(H) = IV(QTR) + N
  8050.       IV(W) = IV(H) + PP1O2
  8051.       IV(LMAT) = IV(W) + 4*P + 7
  8052. C     +++ LENGTH OF W = P*(P+9)/2 + 7.  LMAT IS CONTAINED IN W.
  8053.       IF (V(DINIT) .GE. ZERO) CALL VSCOPY(P, D, V(DINIT))
  8054.       IF (V(JTINIT) .GT. ZERO) CALL VSCOPY(P, V(JTOL1), V(JTINIT))
  8055.       I = JTOL1 + P
  8056.       IF (V(D0INIT) .GT. ZERO) CALL VSCOPY(P, V(I), V(D0INIT))
  8057.       V(RAD0) = ZERO
  8058.       V(STPPAR) = ZERO
  8059.       V(RADIUS) = V(LMAX0) / (ONE + V(PHMXFC))
  8060. C
  8061. C  ***  SET INITIAL MODEL AND S MATRIX  ***
  8062. C
  8063.       IV(MODEL) = 1
  8064.       IF (IV(INITS) .EQ. 2) IV(MODEL) = 2
  8065.       S1 = IV(S)
  8066.       IF (IV(INITS) .EQ. 0) CALL VSCOPY(PP1O2, V(S1), ZERO)
  8067. C
  8068. C  ***  COMPUTE FUNCTION VALUE (HALF THE SUM OF SQUARES)  ***
  8069. C
  8070.  20   T = V2NORM(N, R)
  8071.       IF (T .GT. V(RLIMIT)) IV(TOOBIG) = 1
  8072.       IF (IV(TOOBIG) .NE. 0) GO TO 30
  8073.       V(F) = HALF * T**2
  8074.  30   IF (IV(MODE)) 40, 350, 730
  8075. C
  8076.  40   IF (IV(TOOBIG) .EQ. 0) GO TO 60
  8077.          IV(1) = 13
  8078.          GO TO 900
  8079. C
  8080. C  ***  MAKE SURE JACOBIAN COULD BE COMPUTED  ***
  8081. C
  8082.  50   IF (IV(NFGCAL) .NE. 0) GO TO 60
  8083.          IV(1) = 15
  8084.          GO TO 900
  8085. C
  8086. C  ***  COMPUTE GRADIENT  ***
  8087. C
  8088.  60   IV(KALM) = -1
  8089.       G1 = IV(G)
  8090.       DO 70 I = 1, P
  8091.          V(G1) = DOTPRD(N, R, J(1,I))
  8092.          G1 = G1 + 1
  8093.  70      CONTINUE
  8094.       IF (IV(MODE) .GT. 0) GO TO 710
  8095. C
  8096. C  ***  UPDATE D AND MAKE COPIES OF R FOR POSSIBLE USE LATER  ***
  8097. C
  8098.       IF (IV(DTYPE) .GT. 0) CALL DUPDAT(D, IV, J, N, NN, P, V)
  8099.       RSAVE1 = IV(RSAVE)
  8100.       CALL VCOPY(N, V(RSAVE1), R)
  8101.       QTR1 = IV(QTR)
  8102.       CALL VCOPY(N, V(QTR1), R)
  8103. C
  8104. C  ***  COMPUTE  D**-1 * GRADIENT  ***
  8105. C
  8106.       G1 = IV(G)
  8107.       DIG1 = IV(DIG)
  8108.       K = DIG1
  8109.       DO 80 I = 1, P
  8110.          V(K) = V(G1) / D(I)
  8111.          K = K + 1
  8112.          G1 = G1 + 1
  8113.  80      CONTINUE
  8114.       V(DGNORM) = V2NORM(P, V(DIG1))
  8115. C
  8116.       IF (IV(CNVCOD) .NE. 0) GO TO 700
  8117.       IF (IV(MODE) .EQ. 0) GO TO 570
  8118.       IV(MODE) = 0
  8119. C
  8120. C
  8121. C-----------------------------  MAIN LOOP  -----------------------------
  8122. C
  8123. C
  8124. C  ***  PRINT ITERATION SUMMARY, CHECK ITERATION LIMIT  ***
  8125. C
  8126.  150  CALL ITSMRY(D, IV, P, V, X)
  8127.  160  K = IV(NITER)
  8128.       IF (K .LT. IV(MXITER)) GO TO 170
  8129.          IV(1) = 10
  8130.          GO TO 900
  8131.  170  IV(NITER) = K + 1
  8132. C
  8133. C  ***  UPDATE RADIUS  ***
  8134. C
  8135.       IF (K .EQ. 0) GO TO 185
  8136.       STEP1 = IV(STEP)
  8137.       DO 180 I = 1, P
  8138.          V(STEP1) = D(I) * V(STEP1)
  8139.          STEP1 = STEP1 + 1
  8140.  180     CONTINUE
  8141.       STEP1 = IV(STEP)
  8142.       V(RADIUS) = V(RADFAC) * V2NORM(P, V(STEP1))
  8143. C
  8144. C  ***  INITIALIZE FOR START OF NEXT ITERATION  ***
  8145. C
  8146.  185  X01 = IV(X0)
  8147.       V(F0) = V(F)
  8148.       IV(KAGQT) = -1
  8149.       IV(IRC) = 4
  8150.       IV(H) = -IABS(IV(H))
  8151.       IV(SUSED) = IV(MODEL)
  8152. C
  8153. C     ***  COPY X TO X0  ***
  8154. C
  8155.       CALL VCOPY(P, V(X01), X)
  8156. C
  8157. C  ***  CHECK STOPX AND FUNCTION EVALUATION LIMIT  ***
  8158. C
  8159.  190  IF (.NOT. STOPX(DUMMY)) GO TO 200
  8160.          IV(1) = 11
  8161.          GO TO 205
  8162. C
  8163. C     ***  COME HERE WHEN RESTARTING AFTER FUNC. EVAL. LIMIT OR STOPX.
  8164. C
  8165.  195  IF (V(F) .GE. V(F0)) GO TO 200
  8166.          V(RADFAC) = ONE
  8167.          K = IV(NITER)
  8168.          GO TO 170
  8169. C
  8170.  200  IF (IV(NFCALL) .LT. IV(MXFCAL) + IV(NFCOV)) GO TO 210
  8171.          IV(1) = 9
  8172.  205     IF (V(F) .GE. V(F0)) GO TO 900
  8173. C
  8174. C        ***  IN CASE OF STOPX OR FUNCTION EVALUATION LIMIT WITH
  8175. C        ***  IMPROVED V(F), EVALUATE THE GRADIENT AT X.
  8176. C
  8177.               IV(CNVCOD) = IV(1)
  8178.               GO TO 560
  8179. C
  8180. C. . . . . . . . . . . . .  COMPUTE CANDIDATE STEP  . . . . . . . . . .
  8181. C
  8182.  210  STEP1 = IV(STEP)
  8183.       W1 = IV(W)
  8184.       IF (IV(MODEL) .EQ. 2) GO TO 240
  8185. C
  8186. C  ***  COMPUTE LEVENBERG-MARQUARDT STEP  ***
  8187. C
  8188.          QTR1 = IV(QTR)
  8189.          IF (IV(KALM) .GE. 0) GO TO 215
  8190.               RD1 = IV(RD)
  8191.               IF (-1 .EQ. IV(KALM)) CALL QRFACT(NN, N, P, J, V(RD1),
  8192.      1                                   IV(IPIVOT), IV(IERR), 0, V(W1))
  8193.               CALL QAPPLY(NN, N, P, J, V(QTR1), IV(IERR))
  8194.  215     H1 = IV(H)
  8195.          IF (H1 .GT. 0) GO TO 230
  8196. C
  8197. C        ***  COPY R MATRIX TO H  ***
  8198. C
  8199.               H1 = -H1
  8200.               IV(H) = H1
  8201.               K = H1
  8202.               RD1 = IV(RD)
  8203.               V(K) = V(RD1)
  8204.               IF (P .EQ. 1) GO TO 230
  8205.               DO 220 I = 2, P
  8206.                    CALL VCOPY(I-1, V(K+1), J(1,I))
  8207.                    K = K + I
  8208.                    RD1 = RD1 + 1
  8209.                    V(K) = V(RD1)
  8210.  220               CONTINUE
  8211. C
  8212.  230     G1 = IV(G)
  8213.          CALL LMSTEP(D, V(G1), IV(IERR), IV(IPIVOT), IV(KALM), P,
  8214.      1               V(QTR1), V(H1), V(STEP1), V, V(W1))
  8215.          GO TO 310
  8216. C
  8217. C  ***  COMPUTE GOLDFELD-QUANDT-TROTTER STEP (AUGMENTED MODEL)  ***
  8218. C
  8219.  240  IF (IV(H) .GT. 0) GO TO 300
  8220. C
  8221. C     ***  SET H TO  D**-1 * ( (J**T)*J + S) ) * D**-1.  ***
  8222. C
  8223.          H1 = -IV(H)
  8224.          IV(H) = H1
  8225.          S1 = IV(S)
  8226.          IF (-1 .NE. IV(KALM)) GO TO 270
  8227. C
  8228. C        ***  J IS IN ITS ORIGINAL FORM  ***
  8229. C
  8230.               DO 260 I = 1, P
  8231.                    T = ONE / D(I)
  8232.                    DO 250 K = 1, I
  8233.                         V(H1) = T*(DOTPRD(N,J(1,I),J(1,K))+V(S1)) / D(K)
  8234.                         H1 = H1 + 1
  8235.                         S1 = S1 + 1
  8236.  250                    CONTINUE
  8237.  260               CONTINUE
  8238.               GO TO 300
  8239. C
  8240. C  ***  LMSTEP HAS APPLIED QRFACT TO J  ***
  8241. C
  8242.  270     SMH = S1 - H1
  8243.          H0 = H1 - 1
  8244.          IPIV1 = IV(IPIVOT)
  8245.          T1 = ONE / D(IPIV1)
  8246.          RD0 = IV(RD) - 1
  8247.          RDOF1 = V(RD0 + 1)
  8248.          DO 290 I = 1, P
  8249.               L = IPIV0 + I
  8250.               IPIVI = IV(L)
  8251.               H1 = H0 + IPIVI*(IPIVI-1)/2
  8252.               L = H1 + IPIVI
  8253.               M = L + SMH
  8254. C             ***  V(L) = H(IPIVOT(I), IPIVOT(I))  ***
  8255. C             ***  V(M) = S(IPIVOT(I), IPIVOT(I))  ***
  8256.               T = ONE / D(IPIVI)
  8257.               RDK = RD0 + I
  8258.               E = V(RDK)**2
  8259.               IF (I .GT. 1) E = E + DOTPRD(I-1, J(1,I), J(1,I))
  8260.               V(L) = (E + V(M)) * T**2
  8261.               IF (I .EQ. 1) GO TO 290
  8262.               L = H1 + IPIV1
  8263.               IF (IPIVI .LT. IPIV1) L = L +
  8264.      1                               ((IPIV1-IPIVI)*(IPIV1+IPIVI-3))/2
  8265.               M = L + SMH
  8266. C             ***  V(L) = H(IPIVOT(I), IPIVOT(1))  ***
  8267. C             ***  V(M) = S(IPIVOT(I), IPIVOT(1))  ***
  8268.               V(L) = T * (RDOF1 * J(1,I)  +  V(M)) * T1
  8269.               IF (I .EQ. 2) GO TO 290
  8270.               IM1 = I - 1
  8271.               DO 280 K = 2, IM1
  8272.                    IPK = IPIV0 + K
  8273.                    IPIVK = IV(IPK)
  8274.                    L = H1 + IPIVK
  8275.                    IF (IPIVI .LT. IPIVK) L = L +
  8276.      1                               ((IPIVK-IPIVI)*(IPIVK+IPIVI-3))/2
  8277.                    M = L + SMH
  8278. C                  ***  V(L) = H(IPIVOT(I), IPIVOT(K))  ***
  8279. C                  ***  V(M) = S(IPIVOT(I), IPIVOT(K))  ***
  8280.                    KM1 = K - 1
  8281.                    RDK = RD0 + K
  8282.                    V(L) = T * (DOTPRD(KM1, J(1,I), J(1,K)) +
  8283.      1                            V(RDK)*J(K,I) + V(M)) / D(IPIVK)
  8284.  280               CONTINUE
  8285.  290          CONTINUE
  8286. C
  8287. C  ***  COMPUTE ACTUAL GOLDFELD-QUANDT-TROTTER STEP  ***
  8288. C
  8289.  300  H1 = IV(H)
  8290.       DIG1 = IV(DIG)
  8291.       LMAT1 = IV(LMAT)
  8292.       CALL GQTSTP(D, V(DIG1), V(H1), IV(KAGQT), V(LMAT1), P, V(STEP1),
  8293.      1            V, V(W1))
  8294. C
  8295. C
  8296. C  ***  COMPUTE R(X0 + STEP)  ***
  8297. C
  8298.  310  IF (IV(IRC) .EQ. 6) GO TO 350
  8299.       X01 = IV(X0)
  8300.       STEP1 = IV(STEP)
  8301.       CALL VAXPY(P, X, ONE, V(STEP1), V(X01))
  8302.       IV(NFCALL) = IV(NFCALL) + 1
  8303.       IV(1) = 1
  8304.       IV(TOOBIG) = 0
  8305.       GO TO 999
  8306. C
  8307. C. . . . . . . . . . . . .  ASSESS CANDIDATE STEP  . . . . . . . . . . .
  8308. C
  8309.  350  STEP1 = IV(STEP)
  8310.       LSTGST = IV(STLSTG)
  8311.       X01 = IV(X0)
  8312.       CALL ASSESS(D, IV, P, V(STEP1), V(LSTGST), V, X, V(X01))
  8313. C
  8314. C  ***  IF NECESSARY, SWITCH MODELS AND/OR RESTORE R  ***
  8315. C
  8316.       IF (IV(SWITCH) .EQ. 0) GO TO 360
  8317.          IV(H) = -IABS(IV(H))
  8318.          IV(SUSED) = IV(SUSED) + 2
  8319.          CALL VCOPY(NVSAVE, V, V(VSAVE1))
  8320.  360  IF (IV(RESTOR) .EQ. 0) GO TO 390
  8321.          RSAVE1 = IV(RSAVE)
  8322.          CALL VCOPY(N, R, V(RSAVE1))
  8323.  390  L = IV(IRC) - 4
  8324.       STPMOD = IV(MODEL)
  8325.       IF (L .GT. 0) GO TO (410,440,450,450,450,450,450,450,640,570), L
  8326. C
  8327. C  ***  DECIDE WHETHER TO CHANGE MODELS  ***
  8328. C
  8329.       E = V(PREDUC) - V(FDIF)
  8330.       SSTEP = IV(LKY)
  8331.       S1 = IV(S)
  8332.       CALL SLVMUL(P, V(SSTEP), V(S1), V(STEP1))
  8333.       STTSST = HALF * DOTPRD(P, V(STEP1), V(SSTEP))
  8334.       IF (IV(MODEL) .EQ. 1) STTSST = -STTSST
  8335.       IF (DABS(E + STTSST) * V(FUZZ) .GE. DABS(E)) GO TO 400
  8336. C
  8337. C     ***  SWITCH MODELS  ***
  8338. C
  8339.          IV(MODEL) = 3 - IV(MODEL)
  8340.          IF (IV(MODEL) .EQ. 1) IV(KAGQT) = -1
  8341.          IF (IV(MODEL) .EQ. 2 .AND. IV(KALM) .GT. 0) IV(KALM) = 0
  8342.          IF (-2 .LT. L) GO TO 480
  8343.               IV(H) = -IABS(IV(H))
  8344.               IV(SUSED) = IV(SUSED) + 2
  8345.               CALL VCOPY(NVSAVE, V(VSAVE1), V)
  8346.               GO TO 420
  8347. C
  8348.  400  IF (-3 .LT. L) GO TO 480
  8349. C
  8350. C     ***  RECOMPUTE STEP WITH DECREASED RADIUS  ***
  8351. C
  8352.          V(RADIUS) = V(RADFAC) * V(DSTNRM)
  8353.          GO TO 190
  8354. C
  8355. C  ***  RECOMPUTE STEP, SAVING V VALUES AND R IF NECESSARY  ***
  8356. C
  8357.  410  V(RADIUS) = V(RADFAC) * V(DSTNRM)
  8358.  420  IF (V(F) .GE. V(F0)) GO TO 190
  8359.       RSAVE1 = IV(RSAVE)
  8360.       CALL VCOPY(N, V(RSAVE1), R)
  8361.       GO TO 190
  8362. C
  8363. C  ***  COMPUTE STEP OF LENGTH V(LMAX0) FOR SINGULAR CONVERGENCE TEST
  8364. C
  8365.  440  V(RADIUS) = V(LMAX0)
  8366.       GO TO 210
  8367. C
  8368. C  ***  CONVERGENCE OR FALSE CONVERGENCE  ***
  8369. C
  8370.  450  IV(CNVCOD) = L
  8371.       IF (V(F) .GE. V(F0)) GO TO 700
  8372.          IF (IV(XIRC) .EQ. 14) GO TO 700
  8373.               IV(XIRC) = 14
  8374. C
  8375. C. . . . . . . . . . . .  PROCESS ACCEPTABLE STEP  . . . . . . . . . . .
  8376. C
  8377.  480  IV(COVMAT) = 0
  8378. C
  8379. C  ***  SET  LKY = (J(X0)**T) * R(X)  ***
  8380. C
  8381.       LKY1 = IV(LKY)
  8382.       IF (IV(KALM) .GE. 0) GO TO 500
  8383. C
  8384. C     ***  JACOBIAN HAS NOT BEEN MODIFIED  ***
  8385. C
  8386.          DO 490 I = 1, P
  8387.               V(LKY1) = DOTPRD(N, J(1,I), R)
  8388.               LKY1 = LKY1 + 1
  8389.  490          CONTINUE
  8390.          GO TO 510
  8391. C
  8392. C  ***  QRFACT HAS BEEN APPLIED TO J.  STORE COPY OF R IN QTR AND  ***
  8393. C  ***  APPLY Q TO IT.                                             ***
  8394. C
  8395.  500  QTR1 = IV(QTR)
  8396.       CALL VCOPY(N, V(QTR1), R)
  8397.       CALL QAPPLY(NN, N, P, J, V(QTR1), IV(IERR))
  8398. C
  8399. C  ***  MULTIPLY TOP P-VECTOR IN QTR BY PERMUTED UPPER TRIANGLE    ***
  8400. C  ***  STORED BY QRFACT IN J AND RD.                              ***
  8401. C
  8402.       RD1 = IV(RD)
  8403.       TEMP1 = IV(STLSTG)
  8404.       CALL RPTMUL(3, IV(IPIVOT), J, NN, P, V(RD1), V(QTR1), V(LKY1),
  8405.      1            V(TEMP1))
  8406. C
  8407. C  ***  SEE WHETHER TO SET V(RADFAC) BY GRADIENT TESTS  ***
  8408. C
  8409.  510  IF (IV(IRC) .NE. 3) GO TO 560
  8410.          STEP1 = IV(STEP)
  8411.          TEMP1 = IV(STLSTG)
  8412.          TEMP2 = IV(X0)
  8413. C
  8414. C     ***  SET  TEMP1 = HESSIAN * STEP  FOR USE IN GRADIENT TESTS  ***
  8415. C
  8416.          IF (STPMOD .EQ. 2) GO TO 530
  8417. C
  8418. C        ***  STEP COMPUTED USING GAUSS-NEWTON MODEL  ***
  8419. C        ***  -- QRFACT HAS BEEN APPLIED TO J         ***
  8420. C
  8421.               RD1 = IV(RD)
  8422.               CALL RPTMUL(2, IV(IPIVOT), J, NN, P, V(RD1),
  8423.      1                    V(STEP1), V(TEMP1), V(TEMP2))
  8424.               GO TO 560
  8425. C
  8426. C     ***  STEP COMPUTED USING AUGMENTED MODEL  ***
  8427. C
  8428.  530     H1 = IV(H)
  8429.          K = TEMP2
  8430.          DO 540 I = 1, P
  8431.               V(K) = D(I) * V(STEP1)
  8432.               K = K + 1
  8433.               STEP1 = STEP1 + 1
  8434.  540          CONTINUE
  8435.          CALL SLVMUL(P, V(TEMP1), V(H1), V(TEMP2))
  8436.          DO 550 I = 1, P
  8437.               V(TEMP1) = D(I) * V(TEMP1)
  8438.               TEMP1 = TEMP1 + 1
  8439.  550          CONTINUE
  8440. C
  8441. C  ***  SAVE OLD GRADIENT AND COMPUTE NEW ONE  ***
  8442. C
  8443.  560  IV(NGCALL) = IV(NGCALL) + 1
  8444.       G1 = IV(G)
  8445.       G01 = IV(W)
  8446.       CALL VCOPY(P, V(G01), V(G1))
  8447.       IV(1) = 2
  8448.       GO TO 999
  8449. C
  8450. C  ***  INITIALIZATIONS -- G0 = G - G0, ETC.  ***
  8451. C
  8452.  570  G01 = IV(W)
  8453.       G1 = IV(G)
  8454.       CALL VAXPY(P, V(G01), NEGONE, V(G01), V(G1))
  8455.       STEP1 = IV(STEP)
  8456.       TEMP1 = IV(STLSTG)
  8457.       TEMP2 = IV(X0)
  8458.       IF (IV(IRC) .NE. 3) GO TO 600
  8459. C
  8460. C  ***  SET V(RADFAC) BY GRADIENT TESTS  ***
  8461. C
  8462. C     ***  SET  TEMP1 = D**-1 * (HESSIAN * STEP  +  (G(X0) - G(X)))  ***
  8463. C
  8464.          K = TEMP1
  8465.          L = G01
  8466.          DO 580 I = 1, P
  8467.               V(K) = (V(K) - V(L)) / D(I)
  8468.               K = K + 1
  8469.               L = L + 1
  8470.  580          CONTINUE
  8471. C
  8472. C        ***  DO GRADIENT TESTS  ***
  8473. C
  8474.          IF (V2NORM(P, V(TEMP1)) .LE. V(DGNORM) * V(TUNER4))  GO TO 590
  8475.               IF (DOTPRD(P, V(G1), V(STEP1))
  8476.      1                  .GE. V(GTSTEP) * V(TUNER5))  GO TO 600
  8477.  590               V(RADFAC) = V(INCFAC)
  8478. C
  8479. C  ***  FINISH COMPUTING LKY = ((J(X) - J(X0))**T) * R  ***
  8480. C
  8481. C     ***  CURRENTLY LKY = (J(X0)**T) * R  ***
  8482. C
  8483.  600  LKY1 = IV(LKY)
  8484.       CALL VAXPY(P, V(LKY1), NEGONE, V(LKY1), V(G1))
  8485. C
  8486. C  ***  DETERMINE SIZING FACTOR V(SIZE)  ***
  8487. C
  8488. C     ***  SET TEMP1 = S * STEP  ***
  8489.       S1 = IV(S)
  8490.       CALL SLVMUL(P, V(TEMP1), V(S1), V(STEP1))
  8491. C
  8492.       T1 = DABS(DOTPRD(P, V(STEP1), V(TEMP1)))
  8493.       T = DABS(DOTPRD(P, V(STEP1), V(LKY1)))
  8494.       V(SIZE) = ONE
  8495.       IF (T .LT. T1) V(SIZE) = T / T1
  8496. C
  8497. C  ***  UPDATE S  ***
  8498. C
  8499.       CALL SLUPDT(V(S1), V(COSMIN), P, V(SIZE), V(STEP1), V(TEMP1),
  8500.      1            V(TEMP2), V(G01), V(WSCALE), V(LKY1))
  8501.       IV(1) = 2
  8502.       GO TO 150
  8503. C
  8504. C. . . . . . . . . . . . . .  MISC. DETAILS  . . . . . . . . . . . . . .
  8505. C
  8506. C  ***  BAD PARAMETERS TO ASSESS  ***
  8507. C
  8508.  640  IV(1) = 14
  8509.       GO TO 900
  8510. C
  8511. C  ***  CONVERGENCE OBTAINED -- COMPUTE COVARIANCE MATRIX IF DESIRED ***
  8512. C
  8513.  700  IF (IV(COVREQ) .EQ. 0 .AND. IV(COVPRT) .EQ. 0) GO TO 760
  8514.       IF (IV(COVMAT) .NE. 0) GO TO 760
  8515.       IF (IV(CNVCOD) .GE. 7) GO TO 760
  8516.       IV(MODE) = 0
  8517.  710  CALL COVCLC(I, D, IV, J, N, NN, P, R, V, X)
  8518.       GO TO (720, 720, 740, 750), I
  8519.  720  IV(NFCOV) = IV(NFCOV) + 1
  8520.       IV(NFCALL) = IV(NFCALL) + 1
  8521.       IV(RESTOR) = I
  8522.       IV(1) = 1
  8523.       GO TO 999
  8524. C
  8525.  730  IF (IV(RESTOR) .EQ. 1 .OR. IV(TOOBIG) .NE. 0) GO TO 710
  8526.       IV(NFGCAL) = IV(NFCALL)
  8527.  740  IV(NGCOV) = IV(NGCOV) + 1
  8528.       IV(NGCALL) = IV(NGCALL) + 1
  8529.       IV(1) = 2
  8530.       GO TO 999
  8531. C
  8532.  750  IV(MODE) = 0
  8533.       IF (IV(NITER) .EQ. 0) IV(MODE) = -1
  8534. C
  8535.  760  IV(1) = IV(CNVCOD)
  8536.       IV(CNVCOD) = 0
  8537. C
  8538. C  ***  PRINT SUMMARY OF FINAL ITERATION AND OTHER REQUESTED ITEMS  ***
  8539. C
  8540.  900  CALL ITSMRY(D, IV, P, V, X)
  8541. C
  8542.  999  RETURN
  8543. C
  8544. C  ***  LAST CARD OF NL2ITR FOLLOWS  ***
  8545.       END
  8546.       SUBROUTINE ASSESS (D, IV, P, STEP, STLSTG, V, X, X0)              ASS00010
  8547. C
  8548. C  ***  ASSESS CANDIDATE STEP (NL2SOL VERSION 2.2)  ***
  8549. C
  8550.       INTEGER P, IV(13)
  8551.       DOUBLE PRECISION D(P), STEP(P), STLSTG(P), V(35), X(P), X0(P)
  8552. C
  8553. C  ***  PURPOSE  ***
  8554. C
  8555. C        THIS SUBROUTINE IS CALLED BY AN UNCONSTRAINED MINIMIZATION
  8556. C     ROUTINE TO ASSESS THE NEXT CANDIDATE STEP.  IT MAY RECOMMEND ONE
  8557. C     OF SEVERAL COURSES OF ACTION, SUCH AS ACCEPTING THE STEP, RECOM-
  8558. C     PUTING IT USING THE SAME OR A NEW QUADRATIC MODEL, OR HALTING DUE
  8559. C     TO CONVERGENCE OR FALSE CONVERGENCE.  SEE THE RETURN CODE LISTING
  8560. C     BELOW.
  8561. C
  8562. C--------------------------  PARAMETER USAGE  --------------------------
  8563. C
  8564. C     IV (I/O) INTEGER PARAMETER AND SCRATCH VECTOR -- SEE DESCRIPTION
  8565. C             BELOW OF IV VALUES REFERENCED.
  8566. C      D (IN)  SCALE VECTOR USED IN COMPUTING V(RELDX) -- SEE BELOW.
  8567. C      P (IN)  NUMBER OF PARAMETERS BEING OPTIMIZED.
  8568. C   STEP (I/O) ON INPUT, STEP IS THE STEP TO BE ASSESSED.  IT IS UN-
  8569. C             CHANGED ON OUTPUT UNLESS A PREVIOUS STEP ACHIEVED A
  8570. C             BETTER OBJECTIVE FUNCTION REDUCTION, IN WHICH CASE STLSTG
  8571. C             WILL HAVE BEEN COPIED TO STEP.
  8572. C STLSTG (I/O) WHEN ASSESS RECOMMENDS RECOMPUTING STEP EVEN THOUGH THE
  8573. C             CURRENT (OR A PREVIOUS) STEP YIELDS AN OBJECTIVE FUNC-
  8574. C             TION DECREASE, IT SAVES IN STLSTG THE STEP THAT GAVE THE
  8575. C             BEST FUNCTION REDUCTION SEEN SO FAR (IN THE CURRENT ITERA-
  8576. C             TION).  IF THE RECOMPUTED STEP YIELDS A LARGER FUNCTION
  8577. C             VALUE, THEN STEP IS RESTORED FROM STLSTG AND
  8578. C             X = X0 + STEP IS RECOMPUTED.
  8579. C      V (I/O) REAL PARAMETER AND SCRATCH VECTOR -- SEE DESCRIPTION
  8580. C             BELOW OF V VALUES REFERENCED.
  8581. C      X (I/O) ON INPUT, X = X0 + STEP IS THE POINT AT WHICH THE OBJEC-
  8582. C             TIVE FUNCTION HAS JUST BEEN EVALUATED.  IF AN EARLIER
  8583. C             STEP YIELDED A BIGGER FUNCTION DECREASE, THEN X IS
  8584. C             RESTORED TO THE CORRESPONDING EARLIER VALUE.  OTHERWISE,
  8585. C             IF THE CURRENT STEP DOES NOT GIVE ANY FUNCTION DECREASE,
  8586. C             THEN X IS RESTORED TO X0.
  8587. C     X0 (IN)  INITIAL OBJECTIVE FUNCTION PARAMETER VECTOR (AT THE
  8588. C             START OF THE CURRENT ITERATION).
  8589. C
  8590. C  ***  IV VALUES REFERENCED  ***
  8591. C
  8592. C    IV(IRC) (I/O) ON INPUT FOR THE FIRST STEP TRIED IN A NEW ITERATION,
  8593. C             IV(IRC) SHOULD BE SET TO 3 OR 4 (THE VALUE TO WHICH IT IS
  8594. C             SET WHEN STEP IS DEFINITELY TO BE ACCEPTED).  ON INPUT
  8595. C             AFTER STEP HAS BEEN RECOMPUTED, IV(IRC) SHOULD BE
  8596. C             UNCHANGED SINCE THE PREVIOUS RETURN OF ASSESS.
  8597. C                ON OUTPUT, IV(IRC) IS A RETURN CODE HAVING ONE OF THE
  8598. C             FOLLOWING VALUES...
  8599. C                  1 = SWITCH MODELS OR TRY SMALLER STEP.
  8600. C                  2 = SWITCH MODELS OR ACCEPT STEP.
  8601. C                  3 = ACCEPT STEP AND DETERMINE V(RADFAC) BY GRADIENT
  8602. C                       TESTS.
  8603. C                  4 = ACCEPT STEP, V(RADFAC) HAS BEEN DETERMINED.
  8604. C                  5 = RECOMPUTE STEP (USING THE SAME MODEL).
  8605. C                  6 = RECOMPUTE STEP WITH RADIUS = V(LMAX0) BUT DO NOT
  8606. C                       EVAULATE THE OBJECTIVE FUNCTION.
  8607. C                  7 = X-CONVERGENCE (SEE V(XCTOL)).
  8608. C                  8 = RELATIVE FUNCTION CONVERGENCE (SEE V(RFCTOL)).
  8609. C                  9 = BOTH X- AND RELATIVE FUNCTION CONVERGENCE.
  8610. C                 10 = ABSOLUTE FUNCTION CONVERGENCE (SEE V(AFCTOL)).
  8611. C                 11 = SINGULAR CONVERGENCE (SEE V(LMAX0)).
  8612. C                 12 = FALSE CONVERGENCE (SEE V(XFTOL)).
  8613. C                 13 = IV(IRC) WAS OUT OF RANGE ON INPUT.
  8614. C             RETURN CODE I HAS PRECDENCE OVER I+1 FOR I = 9, 10, 11.
  8615. C IV(MLSTGD) (I/O) SAVED VALUE OF IV(MODEL).
  8616. C  IV(MODEL) (I/O) ON INPUT, IV(MODEL) SHOULD BE AN INTEGER IDENTIFYING
  8617. C             THE CURRENT QUADRATIC MODEL OF THE OBJECTIVE FUNCTION.
  8618. C             IF A PREVIOUS STEP YIELDED A BETTER FUNCTION REDUCTION,
  8619. C             THEN IV(MODEL) WILL BE SET TO IV(MLSTGD) ON OUTPUT.
  8620. C IV(NFCALL) (IN)  INVOCATION COUNT FOR THE OBJECTIVE FUNCTION.
  8621. C IV(NFGCAL) (I/O) VALUE OF IV(NFCALL) AT STEP THAT GAVE THE BIGGEST
  8622. C             FUNCTION REDUCTION THIS ITERATION.  IV(NFGCAL) REMAINS
  8623. C             UNCHANGED UNTIL A FUNCTION REDUCTION IS OBTAINED.
  8624. C IV(RADINC) (I/O) THE NUMBER OF RADIUS INCREASES (OR MINUS THE NUMBER
  8625. C             OF DECREASES) SO FAR THIS ITERATION.
  8626. C IV(RESTOR) (OUT) SET TO 0 UNLESS X AND V(F) HAVE BEEN RESTORED, IN
  8627. C             WHICH CASE ASSESS SETS IV(RESTOR) = 1.
  8628. C  IV(STAGE) (I/O) COUNT OF THE NUMBER OF MODELS TRIED SO FAR IN THE
  8629. C             CURRENT ITERATION.
  8630. C IV(STGLIM) (IN)  MAXIMUM NUMBER OF MODELS TO CONSIDER.
  8631. C IV(SWITCH) (OUT) SET TO 0 UNLESS A NEW MODEL IS BEING TRIED AND IT
  8632. C             GIVES A SMALLER FUNCTION VALUE THAN THE PREVIOUS MODEL,
  8633. C             IN WHICH CASE ASSESS SETS IV(SWITCH) = 1.
  8634. C IV(TOOBIG) (IN)  IS NONZERO IF STEP WAS TOO BIG (E.G. IF IT CAUSED
  8635. C             OVERFLOW).
  8636. C   IV(XIRC) (I/O) VALUE THAT IV(IRC) WOULD HAVE IN THE ABSENCE OF
  8637. C             CONVERGENCE, FALSE CONVERGENCE, AND OVERSIZED STEPS.
  8638. C
  8639. C  ***  V VALUES REFERENCED  ***
  8640. C
  8641. C V(AFCTOL) (IN)  ABSOLUTE FUNCTION CONVERGENCE TOLERANCE.  IF THE
  8642. C             ABSOLUTE VALUE OF THE CURRENT FUNCTION VALUE V(F) IS LESS
  8643. C             THAN V(AFCTOL), THEN ASSESS RETURNS WITH IV(IRC) = 10.
  8644. C V(DECFAC) (IN)  FACTOR BY WHICH TO DECREASE RADIUS WHEN IV(TOOBIG) IS
  8645. C             NONZERO.
  8646. C V(DSTNRM) (IN)  THE 2-NORM OF D*STEP.
  8647. C V(DSTSAV) (I/O) VALUE OF V(DSTNRM) ON SAVED STEP.
  8648. C   V(DST0) (IN)  THE 2-NORM OF D TIMES THE NEWTON STEP (WHEN DEFINED,
  8649. C             I.E., FOR V(NREDUC) .GE. 0).
  8650. C      V(F) (I/O) ON BOTH INPUT AND OUTPUT, V(F) IS THE OBJECTIVE FUNC-
  8651. C             TION VALUE AT X.  IF X IS RESTORED TO A PREVIOUS VALUE,
  8652. C             THEN V(F) IS RESTORED TO THE CORRESPONDING VALUE.
  8653. C   V(FDIF) (OUT) THE FUNCTION REDUCTION V(F0) - V(F) (FOR THE OUTPUT
  8654. C             VALUE OF V(F) IF AN EARLIER STEP GAVE A BIGGER FUNCTION
  8655. C             DECREASE, AND FOR THE INPUT VALUE OF V(F) OTHERWISE).
  8656. C V(FLSTGD) (I/O) SAVED VALUE OF V(F).
  8657. C     V(F0) (IN)  OBJECTIVE FUNCTION VALUE AT START OF ITERATION.
  8658. C V(GTSLST) (I/O) VALUE OF V(GTSTEP) ON SAVED STEP.
  8659. C V(GTSTEP) (IN)  INNER PRODUCT BETWEEN STEP AND GRADIENT.
  8660. C V(INCFAC) (IN)  MINIMUM FACTOR BY WHICH TO INCREASE RADIUS.
  8661. C  V(LMAX0) (IN)  MAXIMUM REASONABLE STEP SIZE (AND INITIAL STEP BOUND).
  8662. C             IF THE ACTUAL FUNCTION DECREASE IS NO MORE THAN TWICE
  8663. C             WHAT WAS PREDICTED, IF A RETURN WITH IV(IRC) = 7, 8, 9,
  8664. C             OR 10 DOES NOT OCCUR, IF V(DSTNRM) .GT. V(LMAX0), AND IF
  8665. C             V(PREDUC) .LE. V(RFCTOL) * ABS(V(F0)), THEN ASSESS RE-
  8666. C             TURNS WITH IV(IRC) = 11.  IF SO DOING APPEARS WORTHWHILE,
  8667. C             THEN ASSESS REPEATS THIS TEST WITH V(PREDUC) COMPUTED FOR
  8668. C             A STEP OF LENGTH V(LMAX0) (BY A RETURN WITH IV(IRC) = 6).
  8669. C V(NREDUC) (I/O)  FUNCTION REDUCTION PREDICTED BY QUADRATIC MODEL FOR
  8670. C             NEWTON STEP.  IF ASSESS IS CALLED WITH IV(IRC) = 6, I.E.,
  8671. C             IF V(PREDUC) HAS BEEN COMPUTED WITH RADIUS = V(LMAX0) FOR
  8672. C             USE IN THE SINGULAR CONVERVENCE TEST, THEN V(NREDUC) IS
  8673. C             SET TO -V(PREDUC) BEFORE THE LATTER IS RESTORED.
  8674. C V(PLSTGD) (I/O) VALUE OF V(PREDUC) ON SAVED STEP.
  8675. C V(PREDUC) (I/O) FUNCTION REDUCTION PREDICTED BY QUADRATIC MODEL FOR
  8676. C             CURRENT STEP.
  8677. C V(RADFAC) (OUT) FACTOR TO BE USED IN DETERMINING THE NEW RADIUS,
  8678. C             WHICH SHOULD BE V(RADFAC)*DST, WHERE  DST  IS EITHER THE
  8679. C             OUTPUT VALUE OF V(DSTNRM) OR THE 2-NORM OF
  8680. C             DIAG(NEWD)*STEP  FOR THE OUTPUT VALUE OF STEP AND THE
  8681. C             UPDATED VERSION, NEWD, OF THE SCALE VECTOR D.  FOR
  8682. C             IV(IRC) = 3, V(RADFAC) = 1.0 IS RETURNED.
  8683. C V(RDFCMN) (IN)  MINIMUM VALUE FOR V(RADFAC) IN TERMS OF THE INPUT
  8684. C             VALUE OF V(DSTNRM) -- SUGGESTED VALUE = 0.1.
  8685. C V(RDFCMX) (IN)  MAXIMUM VALUE FOR V(RADFAC) -- SUGGESTED VALUE = 4.0.
  8686. C  V(RELDX) (OUT) SCALED RELATIVE CHANGE IN X CAUSED BY STEP, COMPUTED
  8687. C             BY FUNCTION  RELDST  AS
  8688. C                 MAX (D(I)*ABS(X(I)-X0(I)), 1 .LE. I .LE. P) /
  8689. C                    MAX (D(I)*(ABS(X(I))+ABS(X0(I))), 1 .LE. I .LE. P).
  8690. C             IF AN ACCEPTABLE STEP IS RETURNED, THEN V(RELDX) IS COM-
  8691. C             PUTED USING THE OUTPUT (POSSIBLY RESTORED) VALUES OF X
  8692. C             AND STEP.  OTHERWISE IT IS COMPUTED USING THE INPUT
  8693. C             VALUES.
  8694. C V(RFCTOL) (IN)  RELATIVE FUNCTION CONVERGENCE TOLERANCE.  IF THE
  8695. C             ACTUAL FUNCTION REDUCTION IS AT MOST TWICE WHAT WAS PRE-
  8696. C             DICTED AND  V(NREDUC) .LE. V(RFCTOL)*ABS(V(F0)),  THEN
  8697. C             ASSESS RETURNS WITH IV(IRC) = 8 OR 9.  SEE ALSO V(LMAX0).
  8698. C V(STPPAR) (IN)  MARQUARDT PARAMETER -- 0 MEANS FULL NEWTON STEP.
  8699. C V(TUNER1) (IN)  TUNING CONSTANT USED TO DECIDE IF THE FUNCTION
  8700. C             REDUCTION WAS MUCH LESS THAN EXPECTED.  SUGGESTED
  8701. C             VALUE = 0.1.
  8702. C V(TUNER2) (IN)  TUNING CONSTANT USED TO DECIDE IF THE FUNCTION
  8703. C             REDUCTION WAS LARGE ENOUGH TO ACCEPT STEP.  SUGGESTED
  8704. C             VALUE = 10**-4.
  8705. C V(TUNER3) (IN)  TUNING CONSTANT USED TO DECIDE IF THE RADIUS
  8706. C             SHOULD BE INCREASED.  SUGGESTED VALUE = 0.75.
  8707. C  V(XCTOL) (IN)  X-CONVERGENCE CRITERION.  IF STEP IS A NEWTON STEP
  8708. C             (V(STPPAR) = 0) HAVING V(RELDX) .LE. V(XCTOL) AND GIVING
  8709. C             AT MOST TWICE THE PREDICTED FUNCTION DECREASE, THEN
  8710. C             ASSESS RETURNS IV(IRC) = 7 OR 9.
  8711. C  V(XFTOL) (IN)  FALSE CONVERGENCE TOLERANCE.  IF STEP GAVE NO OR ONLY
  8712. C             A SMALL FUNCTION DECREASE AND V(RELDX) .LE. V(XFTOL),
  8713. C             THEN ASSESS RETURNS WITH IV(IRC) = 12.
  8714. C
  8715. C-------------------------------  NOTES  -------------------------------
  8716. C
  8717. C  ***  APPLICATION AND USAGE RESTRICTIONS  ***
  8718. C
  8719. C        THIS ROUTINE IS CALLED AS PART OF THE NL2SOL (NONLINEAR
  8720. C     LEAST-SQUARES) PACKAGE.  IT MAY BE USED IN ANY UNCONSTRAINED
  8721. C     MINIMIZATION SOLVER THAT USES DOGLEG, GOLDFELD-QUANDT-TROTTER,
  8722. C     OR LEVENBERG-MARQUARDT STEPS.
  8723. C
  8724. C  ***  ALGORITHM NOTES  ***
  8725. C
  8726. C        SEE (1) FOR FURTHER DISCUSSION OF THE ASSESSING AND MODEL
  8727. C     SWITCHING STRATEGIES.  WHILE NL2SOL CONSIDERS ONLY TWO MODELS,
  8728. C     ASSESS IS DESIGNED TO HANDLE ANY NUMBER OF MODELS.
  8729. C
  8730. C  ***  USAGE NOTES  ***
  8731. C
  8732. C        ON THE FIRST CALL OF AN ITERATION, ONLY THE I/O VARIABLES
  8733. C     STEP, X, IV(IRC), IV(MODEL), V(F), V(DSTNRM), V(GTSTEP), AND
  8734. C     V(PREDUC) NEED HAVE BEEN INITIALIZED.  BETWEEN CALLS, NO I/O
  8735. C     VALUES EXECPT STEP, X, IV(MODEL), V(F) AND THE STOPPING TOLER-
  8736. C     ANCES SHOULD BE CHANGED.
  8737. C        AFTER A RETURN FOR CONVERGENCE OR FALSE CONVERGENCE, ONE CAN
  8738. C     CHANGE THE STOPPING TOLERANCES AND CALL ASSESS AGAIN, IN WHICH
  8739. C     CASE THE STOPPING TESTS WILL BE REPEATED.
  8740. C
  8741. C  ***  REFERENCES  ***
  8742. C
  8743. C     (1) DENNIS, J.E., JR., GAY, D.M., AND WELSCH, R.E. (1981),
  8744. C        AN ADAPTIVE NONLINEAR LEAST-SQUARES ALGORITHM,
  8745. C        ACM TRANS. MATH. SOFTWARE, VOL. 7, NO. 3.
  8746. C
  8747. C     (2) POWELL, M.J.D. (1970)  A FORTRAN SUBROUTINE FOR SOLVING
  8748. C        SYSTEMS OF NONLINEAR ALGEBRAIC EQUATIONS, IN NUMERICAL
  8749. C        METHODS FOR NONLINEAR ALGEBRAIC EQUATIONS, EDITED BY
  8750. C        P. RABINOWITZ, GORDON AND BREACH, LONDON.
  8751. C
  8752. C  ***  HISTORY  ***
  8753. C
  8754. C        JOHN DENNIS DESIGNED MUCH OF THIS ROUTINE, STARTING WITH
  8755. C     IDEAS IN (2). ROY WELSCH SUGGESTED THE MODEL SWITCHING STRATEGY.
  8756. C        DAVID GAY AND STEPHEN PETERS CAST THIS SUBROUTINE INTO A MORE
  8757. C     PORTABLE FORM (WINTER 1977), AND DAVID GAY CAST IT INTO ITS
  8758. C     PRESENT FORM (FALL 1978).
  8759. C
  8760. C  ***  GENERAL  ***
  8761. C
  8762. C     THIS SUBROUTINE WAS WRITTEN IN CONNECTION WITH RESEARCH
  8763. C     SUPPORTED BY THE NATIONAL SCIENCE FOUNDATION UNDER GRANTS
  8764. C     MCS-7600324, DCR75-10143, 76-14311DSS, MCS76-11989, AND
  8765. C     MCS-7906671.
  8766. C
  8767. C------------------------  EXTERNAL QUANTITIES  ------------------------
  8768. C
  8769. C  ***  EXTERNAL FUNCTIONS AND SUBROUTINES  ***
  8770. C
  8771.       EXTERNAL RELDST, VCOPY
  8772.       DOUBLE PRECISION RELDST
  8773. C
  8774. C VCOPY.... COPIES ONE VECTOR TO ANOTHER.
  8775. C
  8776. C  ***  INTRINSIC FUNCTIONS  ***
  8777. C/+
  8778.       INTEGER IABS
  8779.       DOUBLE PRECISION DABS, DMAX1
  8780. C/
  8781. C  ***  NO COMMON BLOCKS  ***
  8782. C
  8783. C--------------------------  LOCAL VARIABLES  --------------------------
  8784. C
  8785.       LOGICAL GOODX
  8786.       INTEGER I, NFC
  8787.       DOUBLE PRECISION EMAX, GTS, HALF, ONE, RELDX1, RFAC1, TWO, XMAX,
  8788.      1                 ZERO
  8789. C
  8790. C  ***  SUBSCRIPTS FOR IV AND V  ***
  8791. C
  8792.       INTEGER AFCTOL, DECFAC, DSTNRM, DSTSAV, DST0, F, FDIF, FLSTGD, F0,
  8793.      1        GTSLST, GTSTEP, INCFAC, IRC, LMAX0, MLSTGD, MODEL, NFCALL,
  8794.      2        NFGCAL, NREDUC, PLSTGD, PREDUC, RADFAC, RADINC, RDFCMN,
  8795.      3        RDFCMX, RELDX, RESTOR, RFCTOL, STAGE, STGLIM, STPPAR,
  8796.      4        SWITCH, TOOBIG, TUNER1, TUNER2, TUNER3, XCTOL, XFTOL,
  8797.      5        XIRC
  8798. C
  8799. C  ***  DATA INITIALIZATIONS  ***
  8800. C
  8801. C/6
  8802.       DATA HALF/0.5D+0/, ONE/1.D+0/, TWO/2.D+0/, ZERO/0.D+0/
  8803. C/7
  8804. C     PARAMETER (HALF=0.5D+0, ONE=1.D+0, TWO=2.D+0, ZERO=0.D+0)
  8805. C/
  8806. C
  8807. C/6
  8808.       DATA IRC/3/, MLSTGD/4/, MODEL/5/, NFCALL/6/,
  8809.      1     NFGCAL/7/, RADINC/8/, RESTOR/9/, STAGE/10/,
  8810.      2     STGLIM/11/, SWITCH/12/, TOOBIG/2/, XIRC/13/
  8811. C/7
  8812. C     PARAMETER (IRC=3, MLSTGD=4, MODEL=5, NFCALL=6,
  8813. C    1     NFGCAL=7, RADINC=8, RESTOR=9, STAGE=10,
  8814. C    2     STGLIM=11, SWITCH=12, TOOBIG=2, XIRC=13)
  8815. C/
  8816. C/6
  8817.       DATA AFCTOL/31/, DECFAC/22/, DSTNRM/2/, DST0/3/,
  8818.      1     DSTSAV/18/, F/10/, FDIF/11/, FLSTGD/12/, F0/13/,
  8819.      2     GTSLST/14/, GTSTEP/4/, INCFAC/23/,
  8820.      3     LMAX0/35/, NREDUC/6/, PLSTGD/15/, PREDUC/7/,
  8821.      4     RADFAC/16/, RDFCMN/24/, RDFCMX/25/,
  8822.      5     RELDX/17/, RFCTOL/32/, STPPAR/5/, TUNER1/26/,
  8823.      6     TUNER2/27/, TUNER3/28/, XCTOL/33/, XFTOL/34/
  8824. C/7
  8825. C     PARAMETER (AFCTOL=31, DECFAC=22, DSTNRM=2, DST0=3,
  8826. C    1     DSTSAV=18, F=10, FDIF=11, FLSTGD=12, F0=13,
  8827. C    2     GTSLST=14, GTSTEP=4, INCFAC=23,
  8828. C    3     LMAX0=35, NREDUC=6, PLSTGD=15, PREDUC=7,
  8829. C    4     RADFAC=16, RDFCMN=24, RDFCMX=25,
  8830. C    5     RELDX=17, RFCTOL=32, STPPAR=5, TUNER1=26,
  8831. C    6     TUNER2=27, TUNER3=28, XCTOL=33, XFTOL=34)
  8832. C/
  8833. C
  8834. C+++++++++++++++++++++++++++++++  BODY  ++++++++++++++++++++++++++++++++
  8835. C
  8836.       NFC = IV(NFCALL)
  8837.       IV(SWITCH) = 0
  8838.       IV(RESTOR) = 0
  8839.       RFAC1 = ONE
  8840.       GOODX = .TRUE.
  8841.       I = IV(IRC)
  8842.       IF (I .GE. 1 .AND. I .LE. 12)
  8843.      1             GO TO (20,30,10,10,40,360,290,290,290,290,290,140), I
  8844.          IV(IRC) = 13
  8845.          GO TO 999
  8846. C
  8847. C  ***  INITIALIZE FOR NEW ITERATION  ***
  8848. C
  8849.  10   IV(STAGE) = 1
  8850.       IV(RADINC) = 0
  8851.       V(FLSTGD) = V(F0)
  8852.       IF (IV(TOOBIG) .EQ. 0) GO TO 90
  8853.          IV(STAGE) = -1
  8854.          IV(XIRC) = I
  8855.          GO TO 60
  8856. C
  8857. C  ***  STEP WAS RECOMPUTED WITH NEW MODEL OR SMALLER RADIUS  ***
  8858. C  ***  FIRST DECIDE WHICH  ***
  8859. C
  8860.  20   IF (IV(MODEL) .NE. IV(MLSTGD)) GO TO 30
  8861. C        ***  OLD MODEL RETAINED, SMALLER RADIUS TRIED  ***
  8862. C        ***  DO NOT CONSIDER ANY MORE NEW MODELS THIS ITERATION  ***
  8863.          IV(STAGE) = IV(STGLIM)
  8864.          IV(RADINC) = -1
  8865.          GO TO 90
  8866. C
  8867. C  ***  A NEW MODEL IS BEING TRIED.  DECIDE WHETHER TO KEEP IT.  ***
  8868. C
  8869.  30   IV(STAGE) = IV(STAGE) + 1
  8870. C
  8871. C     ***  NOW WE ADD THE POSSIBILTIY THAT STEP WAS RECOMPUTED WITH  ***
  8872. C     ***  THE SAME MODEL, PERHAPS BECAUSE OF AN OVERSIZED STEP.     ***
  8873. C
  8874.  40   IF (IV(STAGE) .GT. 0) GO TO 50
  8875. C
  8876. C        ***  STEP WAS RECOMPUTED BECAUSE IT WAS TOO BIG.  ***
  8877. C
  8878.          IF (IV(TOOBIG) .NE. 0) GO TO 60
  8879. C
  8880. C        ***  RESTORE IV(STAGE) AND PICK UP WHERE WE LEFT OFF.  ***
  8881. C
  8882.          IV(STAGE) = -IV(STAGE)
  8883.          I = IV(XIRC)
  8884.          GO TO (20, 30, 90, 90, 70), I
  8885. C
  8886.  50   IF (IV(TOOBIG) .EQ. 0) GO TO 70
  8887. C
  8888. C  ***  HANDLE OVERSIZE STEP  ***
  8889. C
  8890.       IF (IV(RADINC) .GT. 0) GO TO 80
  8891.          IV(STAGE) = -IV(STAGE)
  8892.          IV(XIRC) = IV(IRC)
  8893. C
  8894.  60      V(RADFAC) = V(DECFAC)
  8895.          IV(RADINC) = IV(RADINC) - 1
  8896.          IV(IRC) = 5
  8897.          GO TO 999
  8898. C
  8899.  70   IF (V(F) .LT. V(FLSTGD)) GO TO 90
  8900. C
  8901. C     *** THE NEW STEP IS A LOSER.  RESTORE OLD MODEL.  ***
  8902. C
  8903.       IF (IV(MODEL) .EQ. IV(MLSTGD)) GO TO 80
  8904.          IV(MODEL) = IV(MLSTGD)
  8905.          IV(SWITCH) = 1
  8906. C
  8907. C     ***  RESTORE STEP, ETC. ONLY IF A PREVIOUS STEP DECREASED V(F).
  8908. C
  8909.  80   IF (V(FLSTGD) .GE. V(F0)) GO TO 90
  8910.          IV(RESTOR) = 1
  8911.          V(F) = V(FLSTGD)
  8912.          V(PREDUC) = V(PLSTGD)
  8913.          V(GTSTEP) = V(GTSLST)
  8914.          IF (IV(SWITCH) .EQ. 0) RFAC1 = V(DSTNRM) / V(DSTSAV)
  8915.          V(DSTNRM) = V(DSTSAV)
  8916.          NFC = IV(NFGCAL)
  8917.          GOODX = .FALSE.
  8918. C
  8919. C
  8920. C  ***  COMPUTE RELATIVE CHANGE IN X BY CURRENT STEP  ***
  8921. C
  8922.  90   RELDX1 = RELDST(P, D, X, X0)
  8923. C
  8924. C  ***  RESTORE X AND STEP IF NECESSARY  ***
  8925. C
  8926.       IF (GOODX) GO TO 105
  8927.       DO 100 I = 1, P
  8928.          STEP(I) = STLSTG(I)
  8929.          X(I) = X0(I) + STLSTG(I)
  8930.  100     CONTINUE
  8931. C
  8932.  105  V(FDIF) = V(F0) - V(F)
  8933.       IF (V(FDIF) .GT. V(TUNER2) * V(PREDUC)) GO TO 120
  8934. C
  8935. C        ***  NO (OR ONLY A TRIVIAL) FUNCTION DECREASE
  8936. C        ***  -- SO TRY NEW MODEL OR SMALLER RADIUS
  8937. C
  8938.          V(RELDX) = RELDX1
  8939.          IF (V(F) .LT. V(F0)) GO TO 110
  8940.               IV(MLSTGD) = IV(MODEL)
  8941.               V(FLSTGD) = V(F)
  8942.               V(F) = V(F0)
  8943.               CALL VCOPY(P, X, X0)
  8944.               IV(RESTOR) = 1
  8945.               GO TO 115
  8946.  110     IV(NFGCAL) = NFC
  8947.  115     IV(IRC) = 1
  8948.          IF (IV(STAGE) .LT. IV(STGLIM)) GO TO 130
  8949.               IV(IRC) = 5
  8950.               IV(RADINC) = IV(RADINC) - 1
  8951.               GO TO 130
  8952. C
  8953. C  ***  NONTRIVIAL FUNCTION DECREASE ACHIEVED  ***
  8954. C
  8955.  120  IV(NFGCAL) = NFC
  8956.       RFAC1 = ONE
  8957.       IF (GOODX) V(RELDX) = RELDX1
  8958.       V(DSTSAV) = V(DSTNRM)
  8959.       IF (V(FDIF) .GT. V(PREDUC)*V(TUNER1)) GO TO 200
  8960. C
  8961. C  ***  DECREASE WAS MUCH LESS THAN PREDICTED -- EITHER CHANGE MODELS
  8962. C  ***  OR ACCEPT STEP WITH DECREASED RADIUS.
  8963. C
  8964.       IF (IV(STAGE) .GE. IV(STGLIM)) GO TO 125
  8965. C        ***  CONSIDER SWITCHING MODELS  ***
  8966.          IV(IRC) = 2
  8967.          GO TO 130
  8968. C
  8969. C     ***  ACCEPT STEP WITH DECREASED RADIUS  ***
  8970. C
  8971.  125  IV(IRC) = 4
  8972. C
  8973. C  ***  SET V(RADFAC) TO FLETCHER*S DECREASE FACTOR  ***
  8974. C
  8975.  130  IV(XIRC) = IV(IRC)
  8976.       EMAX = V(GTSTEP) + V(FDIF)
  8977.       V(RADFAC) = HALF * RFAC1
  8978.       IF (EMAX .LT. V(GTSTEP)) V(RADFAC) = RFAC1 * DMAX1(V(RDFCMN),
  8979.      1                                           HALF * V(GTSTEP)/EMAX)
  8980. C
  8981. C  ***  DO FALSE CONVERGENCE TEST  ***
  8982. C
  8983.  140  IF (V(RELDX) .LE. V(XFTOL)) GO TO 160
  8984.          IV(IRC) = IV(XIRC)
  8985.          IF (V(F) .LT. V(F0)) GO TO 230
  8986.               GO TO 300
  8987. C
  8988.  160  IV(IRC) = 12
  8989.       GO TO 310
  8990. C
  8991. C  ***  HANDLE GOOD FUNCTION DECREASE  ***
  8992. C
  8993.  200  IF (V(FDIF) .LT. (-V(TUNER3) * V(GTSTEP))) GO TO 260
  8994. C
  8995. C     ***  INCREASING RADIUS LOOKS WORTHWHILE.  SEE IF WE JUST
  8996. C     ***  RECOMPUTED STEP WITH A DECREASED RADIUS OR RESTORED STEP
  8997. C     ***  AFTER RECOMPUTING IT WITH A LARGER RADIUS.
  8998. C
  8999.       IF (IV(RADINC) .LT. 0) GO TO 260
  9000.       IF (IV(RESTOR) .EQ. 1) GO TO 260
  9001. C
  9002. C        ***  WE DID NOT.  TRY A LONGER STEP UNLESS THIS WAS A NEWTON
  9003. C        ***  STEP.
  9004. C
  9005.          V(RADFAC) = V(RDFCMX)
  9006.          GTS = V(GTSTEP)
  9007.          IF (V(FDIF) .LT. (HALF/V(RADFAC) - ONE) * GTS)
  9008.      1            V(RADFAC) = DMAX1(V(INCFAC), HALF*GTS/(GTS + V(FDIF)))
  9009.          IV(IRC) = 4
  9010.          IF (V(STPPAR) .EQ. ZERO) GO TO 300
  9011. C             ***  STEP WAS NOT A NEWTON STEP.  RECOMPUTE IT WITH
  9012. C             ***  A LARGER RADIUS.
  9013.               IV(IRC) = 5
  9014.               IV(RADINC) = IV(RADINC) + 1
  9015. C
  9016. C  ***  SAVE VALUES CORRESPONDING TO GOOD STEP  ***
  9017. C
  9018.  230  V(FLSTGD) = V(F)
  9019.       IV(MLSTGD) = IV(MODEL)
  9020.       CALL VCOPY(P, STLSTG, STEP)
  9021.       V(DSTSAV) = V(DSTNRM)
  9022.       IV(NFGCAL) = NFC
  9023.       V(PLSTGD) = V(PREDUC)
  9024.       V(GTSLST) = V(GTSTEP)
  9025.       GO TO 300
  9026. C
  9027. C  ***  ACCEPT STEP WITH RADIUS UNCHANGED  ***
  9028. C
  9029.  260  V(RADFAC) = ONE
  9030.       IV(IRC) = 3
  9031.       GO TO 300
  9032. C
  9033. C  ***  COME HERE FOR A RESTART AFTER CONVERGENCE  ***
  9034. C
  9035.  290  IV(IRC) = IV(XIRC)
  9036.       IF (V(DSTSAV) .GE. ZERO) GO TO 310
  9037.          IV(IRC) = 12
  9038.          GO TO 310
  9039. C
  9040. C  ***  PERFORM CONVERGENCE TESTS  ***
  9041. C
  9042.  300  IV(XIRC) = IV(IRC)
  9043.  310  IF (DABS(V(F)) .LT. V(AFCTOL)) IV(IRC) = 10
  9044.       IF (HALF * V(FDIF) .GT. V(PREDUC)) GO TO 999
  9045.       EMAX = V(RFCTOL) * DABS(V(F0))
  9046.       IF (V(DSTNRM) .GT. V(LMAX0) .AND. V(PREDUC) .LE. EMAX)
  9047.      1                       IV(IRC) = 11
  9048.       IF (V(DST0) .LT. ZERO) GO TO 320
  9049.       I = 0
  9050.       IF ((V(NREDUC) .GT. ZERO .AND. V(NREDUC) .LE. EMAX) .OR.
  9051.      1    (V(NREDUC) .EQ. ZERO. AND. V(PREDUC) .EQ. ZERO))  I = 2
  9052.       IF (V(STPPAR) .EQ. ZERO .AND. V(RELDX) .LE. V(XCTOL)
  9053.      1                        .AND. GOODX)                  I = I + 1
  9054.       IF (I .GT. 0) IV(IRC) = I + 6
  9055. C
  9056. C  ***  CONSIDER RECOMPUTING STEP OF LENGTH V(LMAX0) FOR SINGULAR
  9057. C  ***  CONVERGENCE TEST.
  9058. C
  9059.  320  IF (IABS(IV(IRC)-3) .GT. 2 .AND. IV(IRC) .NE. 12) GO TO 999
  9060.       IF (V(DSTNRM) .GT. V(LMAX0)) GO TO 330
  9061.          IF (V(PREDUC) .GE. EMAX) GO TO 999
  9062.               IF (V(DST0) .LE. ZERO) GO TO 340
  9063.                    IF (HALF * V(DST0) .LE. V(LMAX0)) GO TO 999
  9064.                         GO TO 340
  9065.  330  IF (HALF * V(DSTNRM) .LE. V(LMAX0)) GO TO 999
  9066.       XMAX = V(LMAX0) / V(DSTNRM)
  9067.       IF (XMAX * (TWO - XMAX) * V(PREDUC) .GE. EMAX) GO TO 999
  9068.  340  IF (V(NREDUC) .LT. ZERO) GO TO 370
  9069. C
  9070. C  ***  RECOMPUTE V(PREDUC) FOR USE IN SINGULAR CONVERGENCE TEST  ***
  9071. C
  9072.       V(GTSLST) = V(GTSTEP)
  9073.       V(DSTSAV) = V(DSTNRM)
  9074.       IF (IV(IRC) .EQ. 12) V(DSTSAV) = -V(DSTSAV)
  9075.       V(PLSTGD) = V(PREDUC)
  9076.       IV(IRC) = 6
  9077.       CALL VCOPY(P, STLSTG, STEP)
  9078.       GO TO 999
  9079. C
  9080. C  ***  PERFORM SINGULAR CONVERGENCE TEST WITH RECOMPUTED V(PREDUC)  ***
  9081. C
  9082.  360  V(GTSTEP) = V(GTSLST)
  9083.       V(DSTNRM) = DABS(V(DSTSAV))
  9084.       CALL VCOPY(P, STEP, STLSTG)
  9085.       IV(IRC) = IV(XIRC)
  9086.       IF (V(DSTSAV) .LE. ZERO) IV(IRC) = 12
  9087.       V(NREDUC) = -V(PREDUC)
  9088.       V(PREDUC) = V(PLSTGD)
  9089.  370  IF (-V(NREDUC) .LE. V(RFCTOL) * DABS(V(F0))) IV(IRC) = 11
  9090. C
  9091.  999  RETURN
  9092. C
  9093. C  ***  LAST CARD OF ASSESS FOLLOWS  ***
  9094.       END
  9095.       SUBROUTINE COVCLC(COVIRC, D, IV, J, N, NN, P, R, V, X)            COV00010
  9096. C
  9097. C  ***  COMPUTE COVARIANCE MATRIX FOR NL2ITR (NL2SOL VERSION 2.2)  ***
  9098. C
  9099. C  ***  LET K = IABS(IV(COVREQ).  FOR K .LE. 2, A FINITE-DIFFERENCE
  9100. C  ***  HESSIAN H IS COMPUTED (USING FUNC. AND GRAD. VALUES IF
  9101. C  ***  IV(COVREQ) IS NONNEGATIVE, AND USING ONLY FUNC. VALUES IF
  9102. C  ***  IV(COVREQ) IS NEGATIVE).  FOR SCALE = 2*F(X) / MAX(1, N-P),
  9103. C  ***  WHERE 2*F(X) IS THE RESIDUAL SUM OF SQUARES, COVCLC COMPUTES...
  9104. C  ***             K = 0 OR 1...  SCALE * H**-1 * (J**T * J) * H**-1.
  9105. C  ***             K = 2...  SCALE * H**-1.
  9106. C  ***             K .GE. 3...  SCALE * (J**T * J)**-1.
  9107. C
  9108. C  ***  PARAMETER DECLARATIONS  ***
  9109. C
  9110.       INTEGER COVIRC, IV(1), N, NN, P
  9111.       DOUBLE PRECISION D(P), J(NN,P), R(N), V(1), X(P)
  9112. C     DIMENSION IV(*), V(*)
  9113. C
  9114. C  ***  LOCAL VARIABLES  ***
  9115. C
  9116.       LOGICAL HAVEJ
  9117.       INTEGER COV, GP, GSAVE1, G1, HC, HMI, HPI, HPM, I, IPIVI, IPIVK,
  9118.      1        IP1, IRC, K, KIND, KL, L, M, MM1, MM1O2, PP1O2, QTR1,
  9119.      2        RD1, STPI, STPM, STP0, WL, W0, W1
  9120.       DOUBLE PRECISION DEL, HALF, NEGPT5, ONE, T, TWO, WK, ZERO
  9121. C
  9122. C  ***  INTRINSIC FUNCTIONS  ***
  9123. C/+
  9124.       INTEGER IABS, MAX0
  9125.       REAL FLOAT
  9126.       DOUBLE PRECISION DABS, DMAX1
  9127. C/
  9128. C  ***  EXTERNAL SUBROUTINES  ***
  9129. C
  9130.       EXTERNAL LINVRT, LITVMU, LIVMUL, LSQRT, LTSQAR, QRFACT,
  9131.      1         VCOPY, VSCOPY
  9132. C
  9133. C LINVRT... INVERT LOWER TRIANGULAR MATRIX.
  9134. C LITVMU... APPLY INVERSE-TRANSPOSE OF COMPACT LOWER TRIANG. MATRIX.
  9135. C LIVMUL... APPLY INVERSE OF COMPACT LOWER TRIANG. MATRIX.
  9136. C LSQRT.... COMPUTE CHOLESKY FACTOR OF (LOWER TRINAG. OF) A SYM. MATRIX.
  9137. C LTSQAR... GIVEN LOWER TRIANG. MATRIX L, COMPUTE (L**T)*L.
  9138. C QRFACT... COMPUTE QR DECOMPOSITION OF A MATRIX.
  9139. C VCOPY.... COPY ONE VECTOR TO ANOTHER.
  9140. C VSCOPY... SET ALL ELEMENTS OF A VECTOR TO A SCALAR.
  9141. C
  9142. C  ***  SUBSCRIPTS FOR IV AND V  ***
  9143. C
  9144.       INTEGER COVMAT, COVREQ, DELTA, DELTA0, DLTFDC, F, FX, G, H, IERR,
  9145.      1        IPIVOT, IPIV0, KAGQT, KALM, LMAT, MODE, NFGCAL, QTR,
  9146.      2        RD, RSAVE, SAVEI, SWITCH, TOOBIG, W, XMSAVE
  9147. C
  9148. C/6
  9149.       DATA HALF/0.5D+0/, NEGPT5/-0.5D+0/, ONE/1.D+0/, TWO/2.D+0/,
  9150.      1     ZERO/0.D+0/
  9151. C/7
  9152. C     PARAMETER (HALF=0.5D+0, NEGPT5=-0.5D+0, ONE=1.D+0, TWO=2.D+0,
  9153. C    1     ZERO=0.D+0)
  9154. C/
  9155. C
  9156. C/6
  9157.       DATA COVMAT/26/, COVREQ/15/, DELTA/50/, DELTA0/44/,
  9158.      1     DLTFDC/40/, F/10/, FX/46/, G/28/, H/44/, IERR/32/,
  9159.      2     IPIVOT/61/, IPIV0/60/, KAGQT/35/, KALM/36/,
  9160.      3     LMAT/58/, MODE/38/, NFGCAL/7/, QTR/49/,
  9161.      4     RD/51/, RSAVE/52/, SAVEI/54/, SWITCH/12/,
  9162.      5     TOOBIG/2/, W/59/, XMSAVE/49/
  9163. C/7
  9164. C     PARAMETER (COVMAT=26, COVREQ=15, DELTA=50, DELTA0=44,
  9165. C    1     DLTFDC=40, F=10, FX=46, G=28, H=44, IERR=32,
  9166. C    2     IPIVOT=61, IPIV0=60, KAGQT=35, KALM=36,
  9167. C    3     LMAT=58, MODE=38, NFGCAL=7, QTR=49,
  9168. C    4     RD=51, RSAVE=52, SAVEI=54, SWITCH=12,
  9169. C    5     TOOBIG=2, W=59, XMSAVE=49)
  9170. C/
  9171. C
  9172. C+++++++++++++++++++++++++++++++  BODY  ++++++++++++++++++++++++++++++++
  9173. C
  9174.       COVIRC = 4
  9175.       KIND = IV(COVREQ)
  9176.       M = IV(MODE)
  9177.       IF (M .GT. 0) GO TO 10
  9178.          IV(KAGQT) = -1
  9179.          IF (IV(KALM) .GT. 0) IV(KALM) = 0
  9180.          IF (IABS(KIND) .GE. 3) GO TO 300
  9181.          V(FX) = V(F)
  9182.          K = IV(RSAVE)
  9183.          CALL VCOPY(N, V(K), R)
  9184.  10   IF (M .GT. P) GO TO 200
  9185.       IF (KIND .LT. 0) GO TO 100
  9186. C
  9187. C  ***  COMPUTE FINITE-DIFFERENCE HESSIAN USING BOTH FUNCTION AND
  9188. C  ***  GRADIENT VALUES.
  9189. C
  9190.       GSAVE1 = IV(W) + P
  9191.       G1 = IV(G)
  9192.       IF (M .GT. 0) GO TO 15
  9193. C        ***  FIRST CALL ON COVCLC.  SET GSAVE = G, TAKE FIRST STEP  ***
  9194.          CALL VCOPY(P, V(GSAVE1), V(G1))
  9195.          IV(SWITCH) = IV(NFGCAL)
  9196.          GO TO 80
  9197. C
  9198.  15   DEL = V(DELTA)
  9199.       X(M) = V(XMSAVE)
  9200.       IF (IV(TOOBIG) .EQ. 0) GO TO 30
  9201. C
  9202. C     ***  HANDLE OVERSIZE V(DELTA)  ***
  9203. C
  9204.          IF (DEL*X(M) .GT. ZERO) GO TO 20
  9205. C             ***  WE ALREADY TRIED SHRINKING V(DELTA), SO QUIT  ***
  9206.               IV(COVMAT) = -2
  9207.               GO TO 190
  9208. C
  9209. C        ***  TRY SHRINKING V(DELTA)  ***
  9210.  20      DEL = NEGPT5 * DEL
  9211.          GO TO 90
  9212. C
  9213.  30   COV = IV(LMAT)
  9214.       GP = G1 + P - 1
  9215. C
  9216. C  ***  SET  G = (G - GSAVE)/DEL  ***
  9217. C
  9218.       DO 40 I = G1, GP
  9219.          V(I) = (V(I) - V(GSAVE1)) / DEL
  9220.          GSAVE1 = GSAVE1 + 1
  9221.  40      CONTINUE
  9222. C
  9223. C  ***  ADD G AS NEW COL. TO FINITE-DIFF. HESSIAN MATRIX  ***
  9224. C
  9225.       K = COV + M*(M-1)/2
  9226.       L = K + M - 2
  9227.       IF ( M .EQ. 1) GO TO 60
  9228. C
  9229. C  ***  SET  H(I,M) = 0.5 * (H(I,M) + G(I))  FOR I = 1 TO M-1  ***
  9230. C
  9231.       DO 50 I = K, L
  9232.          V(I) = HALF * (V(I) + V(G1))
  9233.          G1 = G1 + 1
  9234.  50      CONTINUE
  9235. C
  9236. C  ***  ADD  H(I,M) = G(I)  FOR I = M TO P  ***
  9237. C
  9238.  60   L = L + 1
  9239.       DO 70 I = M, P
  9240.          V(L) = V(G1)
  9241.          L = L + I
  9242.          G1 = G1 + 1
  9243.  70      CONTINUE
  9244. C
  9245.  80   M = M + 1
  9246.       IV(MODE) = M
  9247.       IF (M .GT. P) GO TO 190
  9248. C
  9249. C  ***  CHOOSE NEXT FINITE-DIFFERENCE STEP, RETURN TO GET G THERE  ***
  9250. C
  9251.       DEL = V(DELTA0) * DMAX1(ONE/D(M), DABS(X(M)))
  9252.       IF (X(M) .LT. ZERO) DEL = -DEL
  9253.       V(XMSAVE) = X(M)
  9254.  90   X(M) = X(M) + DEL
  9255.       V(DELTA) = DEL
  9256.       COVIRC = 2
  9257.       GO TO 999
  9258. C
  9259. C  ***  COMPUTE FINITE-DIFFERENCE HESSIAN USING FUNCTION VALUES ONLY.
  9260. C
  9261.  100  STP0 = IV(W) + P - 1
  9262.       MM1 = M - 1
  9263.       MM1O2 = M*MM1/2
  9264.       IF (M .GT. 0) GO TO 105
  9265. C        ***  FIRST CALL ON COVCLC.  ***
  9266.          IV(SAVEI) = 0
  9267.          GO TO 180
  9268. C
  9269.  105  I = IV(SAVEI)
  9270.       IF (I .GT. 0) GO TO 160
  9271.       IF (IV(TOOBIG) .EQ. 0) GO TO 120
  9272. C
  9273. C     ***  HANDLE OVERSIZE STEP  ***
  9274. C
  9275.          STPM = STP0 + M
  9276.          DEL = V(STPM)
  9277.          IF (DEL*X(XMSAVE) .GT. ZERO) GO TO 110
  9278. C             ***  WE ALREADY TRIED SHRINKING THE STEP, SO QUIT  ***
  9279.               IV(COVMAT) = -2
  9280.               GO TO 999
  9281. C
  9282. C        ***  TRY SHRINKING THE STEP  ***
  9283.  110     DEL = NEGPT5 * DEL
  9284.          X(M) = X(XMSAVE) + DEL
  9285.          V(STPM) = DEL
  9286.          COVIRC = 1
  9287.          GO TO 999
  9288. C
  9289. C  ***  SAVE F(X + STP(M)*E(M)) IN H(P,M)  ***
  9290. C
  9291.  120  PP1O2 = P * (P-1) / 2
  9292.       COV = IV(LMAT)
  9293.       HPM = COV + PP1O2 + MM1
  9294.       V(HPM) = V(F)
  9295. C
  9296. C  ***  START COMPUTING ROW M OF THE FINITE-DIFFERENCE HESSIAN H.  ***
  9297. C
  9298.       HMI = COV + MM1O2
  9299.       IF (MM1 .EQ. 0) GO TO 140
  9300.       HPI = COV + PP1O2
  9301.       DO 130 I = 1, MM1
  9302.          V(HMI) = V(FX) - (V(F) + V(HPI))
  9303.          HMI = HMI + 1
  9304.          HPI = HPI + 1
  9305.  130     CONTINUE
  9306.  140  V(HMI) = V(F) - TWO*V(FX)
  9307. C
  9308. C  ***  COMPUTE FUNCTION VALUES NEEDED TO COMPLETE ROW M OF H.  ***
  9309. C
  9310.       I = 1
  9311. C
  9312.  150  IV(SAVEI) = I
  9313.       STPI = STP0 + I
  9314.       V(DELTA) = X(I)
  9315.       X(I) = X(I) + V(STPI)
  9316.       IF (I .EQ. M) X(I) = V(XMSAVE) - V(STPI)
  9317.       COVIRC = 1
  9318.       GO TO 999
  9319. C
  9320.  160  X(I) = V(DELTA)
  9321.       IF (IV(TOOBIG) .EQ. 0) GO TO 170
  9322. C        ***  PUNT IN THE EVENT OF AN OVERSIZE STEP  ***
  9323.          IV(COVMAT) = -2
  9324.          GO TO 999
  9325. C
  9326. C  ***  FINISH COMPUTING H(M,I)  ***
  9327. C
  9328.  170  STPI = STP0 + I
  9329.       HMI = COV + MM1O2 + I - 1
  9330.       STPM = STP0 + M
  9331.       V(HMI) = (V(HMI) + V(F)) / (V(STPI)*V(STPM))
  9332.       I = I + 1
  9333.       IF (I .LE. M) GO TO 150
  9334.       IV(SAVEI) = 0
  9335.       X(M) = V(XMSAVE)
  9336. C
  9337.  180  M = M + 1
  9338.       IV(MODE) = M
  9339.       IF (M .GT. P) GO TO 190
  9340. C
  9341. C  ***  PREPARE TO COMPUTE ROW M OF THE FINITE-DIFFERENCE HESSIAN H.
  9342. C  ***  COMPUTE M-TH STEP SIZE STP(M), THEN RETURN TO OBTAIN
  9343. C  ***  F(X + STP(M)*E(M)), WHERE E(M) = M-TH STD. UNIT VECTOR.
  9344. C
  9345.       DEL = V(DLTFDC) * DMAX1(ONE/D(M), DABS(X(M)))
  9346.       IF (X(M) .LT. ZERO) DEL = -DEL
  9347.       V(XMSAVE) = X(M)
  9348.       X(M) = X(M) + DEL
  9349.       STPM = STP0 + M
  9350.       V(STPM) = DEL
  9351.       COVIRC = 1
  9352.       GO TO 999
  9353. C
  9354. C  ***  RESTORE R, V(F), ETC.  ***
  9355. C
  9356.  190  K = IV(RSAVE)
  9357.       CALL VCOPY(N, R, V(K))
  9358.       V(F) = V(FX)
  9359.       IF (KIND .LT. 0) GO TO 200
  9360.          IV(NFGCAL) = IV(SWITCH)
  9361.          QTR1 = IV(QTR)
  9362.          CALL VCOPY(N, V(QTR1), R)
  9363.          IF (IV(COVMAT) .LT. 0) GO TO 999
  9364.          COVIRC = 3
  9365.          GO TO 999
  9366. C
  9367.  200  COV = IV(LMAT)
  9368. C
  9369. C  ***  THE COMPLETE FINITE-DIFF. HESSIAN IS NOW STORED AT V(COV).   ***
  9370. C  ***  USE IT TO COMPUTE THE REQUESTED COVARIANCE MATRIX.           ***
  9371. C
  9372. C     ***  COMPUTE CHOLESKY FACTOR C OF H = C*(C**T)  ***
  9373. C     ***  AND STORE IT AT V(HC).  ***
  9374. C
  9375.       HC = COV
  9376.       IF (IABS(KIND) .EQ. 2) GO TO 210
  9377.          HC = IABS(IV(H))
  9378.          IV(H) = -HC
  9379.  210  CALL LSQRT(1, P, V(HC), V(COV), IRC)
  9380.       IV(COVMAT) = -1
  9381.       IF (IRC .NE. 0) GO TO 999
  9382. C
  9383.       W1 = IV(W) + P
  9384.       IF (IABS(KIND) .GT. 1) GO TO 350
  9385. C
  9386. C  ***  COVARIANCE = SCALE * H**-1 * (J**T * J) * H**-1  ***
  9387. C
  9388.       CALL VSCOPY(P*(P+1)/2, V(COV), ZERO)
  9389.       HAVEJ = IV(KALM) .EQ. (-1)
  9390. C     ***  HAVEJ = .TRUE. MEANS J IS IN ITS ORIGINAL FORM, WHILE
  9391. C     ***  HAVEJ = .FALSE. MEANS QRFACT HAS BEEN APPLIED TO J.
  9392. C
  9393.       M = P
  9394.       IF (HAVEJ) M = N
  9395.       W0 = W1 - 1
  9396.       RD1 = IV(RD)
  9397.       DO 290 I = 1, M
  9398.          IF (HAVEJ) GO TO 240
  9399. C
  9400. C        ***  SET W = IPIVOT * (ROW I OF R MATRIX FROM QRFACT).  ***
  9401. C
  9402.               CALL VSCOPY(P, V(W1), ZERO)
  9403.               IPIVI = IPIV0 + I
  9404.               L = W0 + IV(IPIVI)
  9405.               V(L) = V(RD1)
  9406.               RD1 = RD1 + 1
  9407.               IF (I .EQ. P) GO TO 260
  9408.               IP1 = I + 1
  9409.               DO 230 K = IP1, P
  9410.                    IPIVK = IPIV0 + K
  9411.                    L = W0 + IV(IPIVK)
  9412.                    V(L) = J(I,K)
  9413.  230               CONTINUE
  9414.               GO TO 260
  9415. C
  9416. C        ***  SET W = (ROW I OF J).  ***
  9417. C
  9418.  240     L = W0
  9419.          DO 250 K = 1, P
  9420.               L = L + 1
  9421.               V(L) = J(I,K)
  9422.  250          CONTINUE
  9423. C
  9424. C        ***  SET W = H**-1 * W.  ***
  9425. C
  9426.  260     CALL LIVMUL(P, V(W1), V(HC), V(W1))
  9427.          CALL LITVMU(P, V(W1), V(HC), V(W1))
  9428. C
  9429. C        ***  ADD  W * W**T  TO COVARIANCE MATRIX.  ***
  9430. C
  9431.          KL = COV
  9432.          DO 280 K = 1, P
  9433.               L = W0 + K
  9434.               WK = V(L)
  9435.               DO 270 L = 1, K
  9436.                    WL = W0 + L
  9437.                    V(KL) = V(KL)  +  WK * V(WL)
  9438.                    KL = KL + 1
  9439.  270               CONTINUE
  9440.  280          CONTINUE
  9441.  290     CONTINUE
  9442.       GO TO 380
  9443. C
  9444. C  ***  COVARIANCE = SCALE * (J**T * J)**-1.  ***
  9445. C
  9446.  300  RD1 = IV(RD)
  9447.       IF (IV(KALM) .NE. (-1)) GO TO 310
  9448. C
  9449. C        ***  APPLY QRFACT TO J  ***
  9450. C
  9451.          QTR1 = IV(QTR)
  9452.          CALL VCOPY(N, V(QTR1), R)
  9453.          W1 = IV(W) + P
  9454.          CALL QRFACT(NN, N, P, J, V(RD1), IV(IPIVOT), IV(IERR), 0,
  9455.      1               V(W1))
  9456.          IV(KALM) = -2
  9457.  310  IV(COVMAT) = -1
  9458.       IF (IV(IERR) .NE. 0) GO TO 999
  9459.       COV = IV(LMAT)
  9460.       HC = IABS(IV(H))
  9461.       IV(H) = -HC
  9462. C
  9463. C     ***  SET HC = (R MATRIX FROM QRFACT).  ***
  9464. C
  9465.       L = HC
  9466.       DO 340 I = 1, P
  9467.          IF (I .GT. 1) CALL VCOPY(I-1, V(L), J(1,I))
  9468.          L = L + I - 1
  9469.          V(L) = V(RD1)
  9470.          L = L + 1
  9471.          RD1 = RD1 + 1
  9472.  340     CONTINUE
  9473. C
  9474. C  ***  THE CHOLESKY FACTOR C OF THE UNSCALED INVERSE COVARIANCE MATRIX
  9475. C  ***  (OR PERMUTATION THEREOF) IS STORED AT V(HC).
  9476. C
  9477. C  ***  SET C = C**-1.
  9478. C
  9479.  350  CALL LINVRT(P, V(HC), V(HC))
  9480. C
  9481. C  ***  SET C = C**T * C.
  9482. C
  9483.       CALL LTSQAR(P, V(HC), V(HC))
  9484. C
  9485.       IF (HC .EQ. COV) GO TO 380
  9486. C
  9487. C     ***  C = PERMUTED, UNSCALED COVARIANCE.
  9488. C     ***  SET COV = IPIVOT * C * IPIVOT**T.
  9489. C
  9490.          DO 370 I = 1, P
  9491.               M = IPIV0 + I
  9492.               IPIVI = IV(M)
  9493.               KL = COV-1 + IPIVI*(IPIVI-1)/2
  9494.               DO 360 K = 1, I
  9495.                    M = IPIV0 + K
  9496.                    IPIVK = IV(M)
  9497.                    L = KL + IPIVK
  9498.                    IF (IPIVK .GT. IPIVI)
  9499.      1                       L = L + (IPIVK-IPIVI)*(IPIVK+IPIVI-3)/2
  9500.                    V(L) = V(HC)
  9501.                    HC = HC + 1
  9502.  360               CONTINUE
  9503.  370          CONTINUE
  9504. C
  9505.  380  IV(COVMAT) = COV
  9506. C
  9507. C  ***  APPLY SCALE FACTOR = (RESID. SUM OF SQUARES) / MAX(1,N-P).
  9508. C
  9509.       T = V(F) / (HALF * FLOAT(MAX0(1,N-P)))
  9510.       K = COV - 1 + P*(P+1)/2
  9511.       DO 390 I = COV, K
  9512.  390     V(I) = T * V(I)
  9513. C
  9514.  999  RETURN
  9515. C  ***  LAST CARD OF COVCLC FOLLOWS  ***
  9516.       END
  9517.       SUBROUTINE DFAULT(IV, V)                                          DFA00010
  9518. C
  9519. C  ***  SUPPLY NL2SOL (VERSION 2.2) DEFAULT VALUES TO IV AND V  ***
  9520. C
  9521.       INTEGER IV(25)
  9522.       DOUBLE PRECISION V(45)
  9523. C/+
  9524.       DOUBLE PRECISION DMAX1
  9525. C/
  9526.       EXTERNAL IMDCON, RMDCON
  9527.       INTEGER IMDCON
  9528.       DOUBLE PRECISION RMDCON
  9529. C
  9530.       DOUBLE PRECISION MACHEP, MEPCRT, ONE, SQTEPS, THREE
  9531. C
  9532. C  ***  SUBSCRIPTS FOR IV AND V  ***
  9533. C
  9534.       INTEGER AFCTOL, COSMIN, COVPRT, COVREQ, DECFAC, DELTA0, DFAC,
  9535.      1        DINIT, DLTFDC, DLTFDJ, DTYPE, D0INIT, EPSLON, FUZZ,
  9536.      2        INCFAC, INITS, JTINIT, LMAX0, MXFCAL, MXITER, OUTLEV,
  9537.      3        PARPRT, PHMNFC, PHMXFC, PRUNIT, RDFCMN, RDFCMX,
  9538.      4        RFCTOL, RLIMIT, SOLPRT, STATPR, TUNER1, TUNER2, TUNER3,
  9539.      5        TUNER4, TUNER5, XCTOL, XFTOL, X0PRT
  9540. C
  9541. C/6
  9542.       DATA ONE/1.D+0/, THREE/3.D+0/
  9543. C/7
  9544. C     PARAMETER (ONE=1.D+0, THREE=3.D+0)
  9545. C/
  9546. C
  9547. C  ***  IV SUBSCRIPT VALUES  ***
  9548. C
  9549. C/6
  9550.       DATA COVPRT/14/, COVREQ/15/, DTYPE/16/, INITS/25/,
  9551.      1     MXFCAL/17/, MXITER/18/, OUTLEV/19/,
  9552.      2     PARPRT/20/, PRUNIT/21/, SOLPRT/22/,
  9553.      3     STATPR/23/, X0PRT/24/
  9554. C/7
  9555. C     PARAMETER (COVPRT=14, COVREQ=15, DTYPE=16, INITS=25,
  9556. C    1     MXFCAL=17, MXITER=18, OUTLEV=19,
  9557. C    2     PARPRT=20, PRUNIT=21, SOLPRT=22,
  9558. C    3     STATPR=23, X0PRT=24)
  9559. C/
  9560. C
  9561. C  ***  V SUBSCRIPT VALUES  ***
  9562. C
  9563. C/6
  9564.       DATA AFCTOL/31/, COSMIN/43/, DECFAC/22/,
  9565.      1     DELTA0/44/, DFAC/41/, DINIT/38/, DLTFDC/40/,
  9566.      2     DLTFDJ/36/, D0INIT/37/, EPSLON/19/, FUZZ/45/,
  9567.      3     INCFAC/23/, JTINIT/39/, LMAX0/35/, PHMNFC/20/,
  9568.      4     PHMXFC/21/, RDFCMN/24/, RDFCMX/25/,
  9569.      5     RFCTOL/32/, RLIMIT/42/, TUNER1/26/,
  9570.      6     TUNER2/27/, TUNER3/28/, TUNER4/29/,
  9571.      7     TUNER5/30/, XCTOL/33/, XFTOL/34/
  9572. C/7
  9573. C     PARAMETER (AFCTOL=31, COSMIN=43, DECFAC=22,
  9574. C    1     DELTA0=44, DFAC=41, DINIT=38, DLTFDC=40,
  9575. C    2     DLTFDJ=36, D0INIT=37, EPSLON=19, FUZZ=45,
  9576. C    3     INCFAC=23, JTINIT=39, LMAX0=35, PHMNFC=20,
  9577. C    4     PHMXFC=21, RDFCMN=24, RDFCMX=25,
  9578. C    5     RFCTOL=32, RLIMIT=42, TUNER1=26,
  9579. C    6     TUNER2=27, TUNER3=28, TUNER4=29,
  9580. C    7     TUNER5=30, XCTOL=33, XFTOL=34)
  9581. C/
  9582. C
  9583. C-----------------------------------------------------------------------
  9584. C
  9585.       IV(1) = 12
  9586.       IV(COVPRT) = 1
  9587.       IV(COVREQ) = 1
  9588.       IV(DTYPE) = 1
  9589.       IV(INITS) = 0
  9590.       IV(MXFCAL) = 200
  9591.       IV(MXITER) = 150
  9592.       IV(OUTLEV) = 1
  9593.       IV(PARPRT) = 1
  9594.       IV(PRUNIT) = IMDCON(1)
  9595.       IV(SOLPRT) = 1
  9596.       IV(STATPR) = 1
  9597.       IV(X0PRT) = 1
  9598. C
  9599.       MACHEP = RMDCON(3)
  9600.       V(AFCTOL) = 1.D-20
  9601.       IF (MACHEP .GT. 1.D-10) V(AFCTOL) = MACHEP**2
  9602.       V(COSMIN) = DMAX1(1.D-6, 1.D+2 * MACHEP)
  9603.       V(DECFAC) = 0.5D+0
  9604.       SQTEPS = RMDCON(4)
  9605.       V(DELTA0) = SQTEPS
  9606.       V(DFAC) = 0.6D+0
  9607.       V(DINIT) = 0.D+0
  9608.       MEPCRT = MACHEP ** (ONE/THREE)
  9609.       V(DLTFDC) = MEPCRT
  9610.       V(DLTFDJ) = SQTEPS
  9611.       V(D0INIT) = 1.D+0
  9612.       V(EPSLON) = 0.1D+0
  9613.       V(FUZZ) = 1.5D+0
  9614.       V(INCFAC) = 2.D+0
  9615.       V(JTINIT) = 1.D-6
  9616.       V(LMAX0) = 100.D+0
  9617.       V(PHMNFC) = -0.1D+0
  9618.       V(PHMXFC) = 0.1D+0
  9619.       V(RDFCMN) = 0.1D+0
  9620.       V(RDFCMX) = 4.D+0
  9621.       V(RFCTOL) = DMAX1(1.D-10, MEPCRT**2)
  9622.       V(RLIMIT) = RMDCON(5)
  9623.       V(TUNER1) = 0.1D+0
  9624.       V(TUNER2) = 1.D-4
  9625.       V(TUNER3) = 0.75D+0
  9626.       V(TUNER4) = 0.5D+0
  9627.       V(TUNER5) = 0.75D+0
  9628.       V(XCTOL) = SQTEPS
  9629.       V(XFTOL) = 1.D+2 * MACHEP
  9630. C
  9631.  999  RETURN
  9632. C  ***  LAST CARD OF DFAULT FOLLOWS  ***
  9633.       END
  9634.       DOUBLE PRECISION FUNCTION DOTPRD(P, X, Y)                         DOT00010
  9635. C
  9636. C  ***  RETURN THE INNER PRODUCT OF THE P-VECTORS X AND Y.  ***
  9637. C
  9638.       INTEGER P
  9639.       DOUBLE PRECISION X(P), Y(P)
  9640. C
  9641.       INTEGER I
  9642.       DOUBLE PRECISION ONE, SQTETA, T, ZERO
  9643. C/+
  9644.       DOUBLE PRECISION DMAX1, DABS
  9645. C/
  9646.       EXTERNAL RMDCON
  9647.       DOUBLE PRECISION RMDCON
  9648. C
  9649. C  ***  RMDCON(2) RETURNS A MACHINE-DEPENDENT CONSTANT, SQTETA, WHICH
  9650. C  ***  IS SLIGHTLY LARGER THAN THE SMALLEST POSITIVE NUMBER THAT
  9651. C  ***  CAN BE SQUARED WITHOUT UNDERFLOWING.
  9652. C
  9653. C/6
  9654.       DATA ONE/1.D+0/, SQTETA/0.D+0/, ZERO/0.D+0/
  9655. C/7
  9656. C     PARAMETER (ONE=1.D+0, ZERO=0.D+0)
  9657. C     DATA SQTETA/0.D+0/
  9658. C/
  9659. C
  9660.       DOTPRD = ZERO
  9661.       IF (P .LE. 0) GO TO 999
  9662.       IF (SQTETA .EQ. ZERO) SQTETA = RMDCON(2)
  9663.       DO 20 I = 1, P
  9664.          T = DMAX1(DABS(X(I)), DABS(Y(I)))
  9665.          IF (T .GT. ONE) GO TO 10
  9666.          IF (T .LT. SQTETA) GO TO 20
  9667.          T = (X(I)/SQTETA)*Y(I)
  9668.          IF (DABS(T) .LT. SQTETA) GO TO 20
  9669.  10      DOTPRD = DOTPRD + X(I)*Y(I)
  9670.  20   CONTINUE
  9671. C
  9672.  999  RETURN
  9673. C  ***  LAST CARD OF DOTPRD FOLLOWS  ***
  9674.       END
  9675.       SUBROUTINE DUPDAT(D, IV, J, N, NN, P, V)                          DUP00010
  9676. C
  9677. C  ***  UPDATE SCALE VECTOR D FOR NL2ITR (NL2SOL VERSION 2.2)  ***
  9678. C
  9679. C  ***  PARAMETER DECLARATIONS  ***
  9680. C
  9681.       INTEGER IV(1), N, NN, P
  9682.       DOUBLE PRECISION D(P), J(NN,P), V(1)
  9683. C     DIMENSION IV(*), V(*)
  9684. C
  9685. C  ***  LOCAL VARIABLES  ***
  9686. C
  9687.       INTEGER D0, I, JTOLI, S1
  9688.       DOUBLE PRECISION SII, T, VDFAC
  9689. C
  9690. C     ***  CONSTANTS  ***
  9691.       DOUBLE PRECISION ZERO
  9692. C
  9693. C  ***  INTRINSIC FUNCTIONS  ***
  9694. C/+
  9695.       DOUBLE PRECISION DMAX1, DSQRT
  9696. C/
  9697. C  ***  EXTERNAL FUNCTION  ***
  9698. C
  9699.       EXTERNAL V2NORM
  9700.       DOUBLE PRECISION V2NORM
  9701. C
  9702. C  ***  SUBSCRIPTS FOR IV AND V  ***
  9703. C
  9704.       INTEGER DFAC, DTYPE, JTOL0, NITER, S
  9705. C/6
  9706.       DATA DFAC/41/, DTYPE/16/, JTOL0/86/, NITER/31/, S/53/
  9707. C/7
  9708. C     PARAMETER (DFAC=41, DTYPE=16, JTOL0=86, NITER=31, S=53)
  9709. C/
  9710. C
  9711. C/6
  9712.       DATA ZERO/0.D+0/
  9713. C/7
  9714. C     PARAMETER (ZERO=0.D+0)
  9715. C/
  9716. C
  9717. C-----------------------------------------------------------------------
  9718. C
  9719.       I = IV(DTYPE)
  9720.       IF (I .EQ. 1) GO TO 20
  9721.          IF (IV(NITER) .GT. 0) GO TO 999
  9722. C
  9723.  20   VDFAC = V(DFAC)
  9724.       D0 = JTOL0 + P
  9725.       S1 = IV(S) - 1
  9726.       DO 30 I = 1, P
  9727.          S1 = S1 + I
  9728.          SII = V(S1)
  9729.          T = V2NORM(N, J(1,I))
  9730.          IF (SII .GT. ZERO) T = DSQRT(T*T + SII)
  9731.          JTOLI = JTOL0 + I
  9732.          D0 = D0 + 1
  9733.          IF (T .LT. V(JTOLI)) T = DMAX1(V(D0), V(JTOLI))
  9734.          D(I) = DMAX1(VDFAC*D(I), T)
  9735.  30      CONTINUE
  9736. C
  9737.  999  RETURN
  9738. C  ***  LAST CARD OF DUPDAT FOLLOWS  ***
  9739.       END
  9740.       SUBROUTINE GQTSTP(D, DIG, DIHDI, KA, L, P, STEP, V, W)            GQT00010
  9741. C
  9742. C  *** COMPUTE GOLDFELD-QUANDT-TROTTER STEP BY MORE-HEBDEN TECHNIQUE ***
  9743. C  ***  (NL2SOL VERSION 2.2)  ***
  9744. C
  9745. C  ***  PARAMETER DECLARATIONS  ***
  9746. C
  9747.       INTEGER KA, P
  9748.       DOUBLE PRECISION D(P), DIG(P), DIHDI(1), L(1), V(21), STEP(P),
  9749.      1                 W(1)
  9750. C     DIMENSION DIHDI(P*(P+1)/2), L(P*(P+1)/2), W(4*P+7)
  9751. C
  9752. C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  9753. C
  9754. C  ***  PURPOSE  ***
  9755. C
  9756. C        GIVEN THE (COMPACTLY STORED) LOWER TRIANGLE OF A SCALED
  9757. C     HESSIAN (APPROXIMATION) AND A NONZERO SCALED GRADIENT VECTOR,
  9758. C     THIS SUBROUTINE COMPUTES A GOLDFELD-QUANDT-TROTTER STEP OF
  9759. C     APPROXIMATE LENGTH V(RADIUS) BY THE MORE-HEBDEN TECHNIQUE.  IN
  9760. C     OTHER WORDS, STEP IS COMPUTED TO (APPROXIMATELY) MINIMIZE
  9761. C     PSI(STEP) = (G**T)*STEP + 0.5*(STEP**T)*H*STEP  SUCH THAT THE
  9762. C     2-NORM OF D*STEP IS AT MOST (APPROXIMATELY) V(RADIUS), WHERE
  9763. C     G  IS THE GRADIENT,  H  IS THE HESSIAN, AND  D  IS A DIAGONAL
  9764. C     SCALE MATRIX WHOSE DIAGONAL IS STORED IN THE PARAMETER D.
  9765. C     (GQTSTP ASSUMES  DIG = D**-1 * G  AND  DIHDI = D**-1 * H * D**-1.)
  9766. C     IF G = 0, HOWEVER, STEP = 0 IS RETURNED (EVEN AT A SADDLE POINT).
  9767. C
  9768. C  ***  PARAMETER DESCRIPTION  ***
  9769. C
  9770. C     D (IN)  = THE SCALE VECTOR, I.E. THE DIAGONAL OF THE SCALE
  9771. C              MATRIX  D  MENTIONED ABOVE UNDER PURPOSE.
  9772. C   DIG (IN)  = THE SCALED GRADIENT VECTOR, D**-1 * G.  IF G = 0, THEN
  9773. C              STEP = 0  AND  V(STPPAR) = 0  ARE RETURNED.
  9774. C DIHDI (IN)  = LOWER TRIANGLE OF THE SCALED HESSIAN (APPROXIMATION),
  9775. C              I.E., D**-1 * H * D**-1, STORED COMPACTLY BY ROWS., I.E.,
  9776. C              IN THE ORDER (1,1), (2,1), (2,2), (3,1), (3,2), ETC.
  9777. C    KA (I/O) = THE NUMBER OF HEBDEN ITERATIONS (SO FAR) TAKEN TO DETER-
  9778. C              MINE STEP.  KA .LT. 0 ON INPUT MEANS THIS IS THE FIRST
  9779. C              ATTEMPT TO DETERMINE STEP (FOR THE PRESENT DIG AND DIHDI)
  9780. C              -- KA IS INITIALIZED TO 0 IN THIS CASE.  OUTPUT WITH
  9781. C              KA = 0  (OR V(STPPAR) = 0)  MEANS  STEP = -(H**-1)*G.
  9782. C     L (I/O) = WORKSPACE OF LENGTH P*(P+1)/2 FOR CHOLESKY FACTORS.
  9783. C     P (IN)  = NUMBER OF PARAMETERS -- THE HESSIAN IS A  P X P  MATRIX.
  9784. C  STEP (I/O) = THE STEP COMPUTED.
  9785. C     V (I/O) CONTAINS VARIOUS CONSTANTS AND VARIABLES DESCRIBED BELOW.
  9786. C     W (I/O) = WORKSPACE OF LENGTH 4*P + 6.
  9787. C
  9788. C  ***  ENTRIES IN V  ***
  9789. C
  9790. C V(DGNORM) (I/O) = 2-NORM OF (D**-1)*G.
  9791. C V(DSTNRM) (OUTPUT) = 2-NORM OF D*STEP.
  9792. C V(DST0)   (I/O) = 2-NORM OF D*(H**-1)*G (FOR POS. DEF. H ONLY), OR
  9793. C             OVERESTIMATE OF SMALLEST EIGENVALUE OF (D**-1)*H*(D**-1).
  9794. C V(EPSLON) (IN)  = MAX. REL. ERROR ALLOWED FOR PSI(STEP).  FOR THE
  9795. C             STEP RETURNED, PSI(STEP) WILL EXCEED ITS OPTIMAL VALUE
  9796. C             BY LESS THAN -V(EPSLON)*PSI(STEP).  SUGGESTED VALUE = 0.1.
  9797. C V(GTSTEP) (OUT) = INNER PRODUCT BETWEEN G AND STEP.
  9798. C V(NREDUC) (OUT) = PSI(-(H**-1)*G) = PSI(NEWTON STEP)  (FOR POS. DEF.
  9799. C             H ONLY -- V(NREDUC) IS SET TO ZERO OTHERWISE).
  9800. C V(PHMNFC) (IN)  = TOL. (TOGETHER WITH V(PHMXFC)) FOR ACCEPTING STEP
  9801. C             (MORE*S SIGMA).  THE ERROR V(DSTNRM) - V(RADIUS) MUST LIE
  9802. C             BETWEEN V(PHMNFC)*V(RADIUS) AND V(PHMXFC)*V(RADIUS).
  9803. C V(PHMXFC) (IN)  (SEE V(PHMNFC).)
  9804. C             SUGGESTED VALUES -- V(PHMNFC) = -0.25, V(PHMXFC) = 0.5.
  9805. C V(PREDUC) (OUT) = PSI(STEP) = PREDICTED OBJ. FUNC. REDUCTION FOR STEP.
  9806. C V(RADIUS) (IN)  = RADIUS OF CURRENT (SCALED) TRUST REGION.
  9807. C V(RAD0)   (I/O) = VALUE OF V(RADIUS) FROM PREVIOUS CALL.
  9808. C V(STPPAR) (I/O) IS NORMALLY THE MARQUARDT PARAMETER, I.E. THE ALPHA
  9809. C             DESCRIBED BELOW UNDER ALGORITHM NOTES.  IF H + ALPHA*D**2
  9810. C             (SEE ALGORITHM NOTES) IS (NEARLY) SINGULAR, HOWEVER,
  9811. C             THEN V(STPPAR) = -ALPHA.
  9812. C
  9813. C  ***  USAGE NOTES  ***
  9814. C
  9815. C     IF IT IS DESIRED TO RECOMPUTE STEP USING A DIFFERENT VALUE OF
  9816. C     V(RADIUS), THEN THIS ROUTINE MAY BE RESTARTED BY CALLING IT
  9817. C     WITH ALL PARAMETERS UNCHANGED EXCEPT V(RADIUS).  (THIS EXPLAINS
  9818. C     WHY STEP AND W ARE LISTED AS I/O).  ON AN INTIIAL CALL (ONE WITH
  9819. C     KA .LT. 0), STEP AND W NEED NOT BE INITIALIZED AND ONLY COMPO-
  9820. C     NENTS V(EPSLON), V(STPPAR), V(PHMNFC), V(PHMXFC), V(RADIUS), AND
  9821. C     V(RAD0) OF V MUST BE INITIALIZED.  TO COMPUTE STEP FROM A SADDLE
  9822. C     POINT (WHERE THE TRUE GRADIENT VANISHES AND H HAS A NEGATIVE
  9823. C     EIGENVALUE), A NONZERO G WITH SMALL COMPONENTS SHOULD BE PASSED.
  9824. C
  9825. C  ***  APPLICATION AND USAGE RESTRICTIONS  ***
  9826. C
  9827. C     THIS ROUTINE IS CALLED AS PART OF THE NL2SOL (NONLINEAR LEAST-
  9828. C     SQUARES) PACKAGE (REF. 1), BUT IT COULD BE USED IN SOLVING ANY
  9829. C     UNCONSTRAINED MINIMIZATION PROBLEM.
  9830. C
  9831. C  ***  ALGORITHM NOTES  ***
  9832. C
  9833. C        THE DESIRED G-Q-T STEP (REF. 2, 3, 4) SATISFIES
  9834. C     (H + ALPHA*D**2)*STEP = -G  FOR SOME NONNEGATIVE ALPHA SUCH THAT
  9835. C     H + ALPHA*D**2 IS POSITIVE SEMIDEFINITE.  ALPHA AND STEP ARE
  9836. C     COMPUTED BY A SCHEME ANALOGOUS TO THE ONE DESCRIBED IN REF. 5.
  9837. C     ESTIMATES OF THE SMALLEST AND LARGEST EIGENVALUES OF THE HESSIAN
  9838. C     ARE OBTAINED FROM THE GERSCHGORIN CIRCLE THEOREM ENHANCED BY A
  9839. C     SIMPLE FORM OF THE SCALING DESCRIBED IN REF. 6.  CASES IN WHICH
  9840. C     H + ALPHA*D**2 IS NEARLY (OR EXACTLY) SINGULAR ARE HANDLED BY
  9841. C     THE TECHNIQUE DISCUSSED IN REF. 2.  IN THESE CASES, A STEP OF
  9842. C     (EXACT) LENGTH V(RADIUS) IS RETURNED FOR WHICH PSI(STEP) EXCEEDS
  9843. C     ITS OPTIMAL VALUE BY LESS THAN -V(EPSLON)*PSI(STEP).
  9844. C
  9845. C  ***  FUNCTIONS AND SUBROUTINES CALLED  ***
  9846. C
  9847. C DOTPRD - RETURNS INNER PRODUCT OF TWO VECTORS.
  9848. C LITVMU - APPLIES INVERSE-TRANSPOSE OF COMPACT LOWER TRIANG. MATRIX.
  9849. C LIVMUL - APPLIES INVERSE OF COMPACT LOWER TRIANG. MATRIX.
  9850. C LSQRT  - FINDS CHOLESKY FACTOR (OF COMPACTLY STORED LOWER TRIANG.).
  9851. C LSVMIN - RETURNS APPROX. TO MIN. SING. VALUE OF LOWER TRIANG. MATRIX.
  9852. C RMDCON - RETURNS MACHINE-DEPENDENT CONSTANTS.
  9853. C V2NORM - RETURNS 2-NORM OF A VECTOR.
  9854. C
  9855. C  ***  REFERENCES  ***
  9856. C
  9857. C 1.  DENNIS, J.E., GAY, D.M., AND WELSCH, R.E. (1981), AN ADAPTIVE
  9858. C             NONLINEAR LEAST-SQUARES ALGORITHM, ACM TRANS. MATH.
  9859. C             SOFTWARE, VOL. 7, NO. 3.
  9860. C 2.  GAY, D.M. (1981), COMPUTING OPTIMAL LOCALLY CONSTRAINED STEPS,
  9861. C             SIAM J. SCI. STATIST. COMPUTING, VOL. 2, NO. 2, PP.
  9862. C             186-197.
  9863. C 3.  GOLDFELD, S.M., QUANDT, R.E., AND TROTTER, H.F. (1966),
  9864. C             MAXIMIZATION BY QUADRATIC HILL-CLIMBING, ECONOMETRICA 34,
  9865. C             PP. 541-551.
  9866. C 4.  HEBDEN, M.D. (1973), AN ALGORITHM FOR MINIMIZATION USING EXACT
  9867. C             SECOND DERIVATIVES, REPORT T.P. 515, THEORETICAL PHYSICS
  9868. C             DIV., A.E.R.E. HARWELL, OXON., ENGLAND.
  9869. C 5.  MORE, J.J. (1978), THE LEVENBERG-MARQUARDT ALGORITHM, IMPLEMEN-
  9870. C             TATION AND THEORY, PP.105-116 OF SPRINGER LECTURE NOTES
  9871. C             IN MATHEMATICS NO. 630, EDITED BY G.A. WATSON, SPRINGER-
  9872. C             VERLAG, BERLIN AND NEW YORK.
  9873. C 6.  VARGA, R.S. (1965), MINIMAL GERSCHGORIN SETS, PACIFIC J. MATH. 15,
  9874. C             PP. 719-729.
  9875. C
  9876. C  ***  GENERAL  ***
  9877. C
  9878. C     CODED BY DAVID M. GAY.
  9879. C     THIS SUBROUTINE WAS WRITTEN IN CONNECTION WITH RESEARCH
  9880. C     SUPPORTED BY THE NATIONAL SCIENCE FOUNDATION UNDER GRANTS
  9881. C     MCS-7600324, DCR75-10143, 76-14311DSS, MCS76-11989, AND
  9882. C     MCS-7906671.
  9883. C
  9884. C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  9885. C
  9886. C  ***  LOCAL VARIABLES  ***
  9887. C
  9888.       LOGICAL RESTRT
  9889.       INTEGER DGGDMX, DIAG, DIAG0, DSTSAV, EMAX, EMIN, I, IM1, INC, IRC,
  9890.      1        J, K, KALIM, K1, LK0, PHIPIN, Q, Q0, UK0, X, X0
  9891.       DOUBLE PRECISION ALPHAK, AKI, AKK, DELTA, DST, EPSO6, LK,
  9892.      1                 OLDPHI, PHI, PHIMAX, PHIMIN, PSIFAC, RAD,
  9893.      2                 ROOT, SI, SK, SW, T, TWOPSI, T1, UK, WI
  9894. C
  9895. C     ***  CONSTANTS  ***
  9896.       DOUBLE PRECISION DGXFAC, EPSFAC, FOUR, HALF, KAPPA, NEGONE, ONE,
  9897.      1                 P001, SIX, THREE, TWO, ZERO
  9898. C
  9899. C  ***  INTRINSIC FUNCTIONS  ***
  9900. C/+
  9901.       DOUBLE PRECISION DABS, DMAX1, DMIN1, DSQRT
  9902. C/
  9903. C  ***  EXTERNAL FUNCTIONS AND SUBROUTINES  ***
  9904. C
  9905.       EXTERNAL DOTPRD, LITVMU, LIVMUL, LSQRT, LSVMIN, RMDCON, V2NORM
  9906.       DOUBLE PRECISION DOTPRD, LSVMIN, RMDCON, V2NORM
  9907. C
  9908. C  ***  SUBSCRIPTS FOR V  ***
  9909. C
  9910.       INTEGER DGNORM, DSTNRM, DST0, EPSLON, GTSTEP, STPPAR, NREDUC,
  9911.      1        PHMNFC, PHMXFC, PREDUC, RADIUS, RAD0
  9912. C/6
  9913.       DATA DGNORM/1/, DSTNRM/2/, DST0/3/, EPSLON/19/,
  9914.      1     GTSTEP/4/, NREDUC/6/, PHMNFC/20/,
  9915.      2     PHMXFC/21/, PREDUC/7/, RADIUS/8/,
  9916.      3     RAD0/9/, STPPAR/5/
  9917. C/7
  9918. C     PARAMETER (DGNORM=1, DSTNRM=2, DST0=3, EPSLON=19,
  9919. C    1     GTSTEP=4, NREDUC=6, PHMNFC=20,
  9920. C    2     PHMXFC=21, PREDUC=7, RADIUS=8,
  9921. C    3     RAD0=9, STPPAR=5)
  9922. C/
  9923. C
  9924. C/6
  9925.       DATA EPSFAC/50.0D+0/, FOUR/4.0D+0/, HALF/0.5D+0/,
  9926.      1     KAPPA/2.0D+0/, NEGONE/-1.0D+0/, ONE/1.0D+0/, P001/1.0D-3/,
  9927.      2     SIX/6.0D+0/, THREE/3.0D+0/, TWO/2.0D+0/, ZERO/0.0D+0/
  9928. C/7
  9929. C     PARAMETER (EPSFAC=50.0D+0, FOUR=4.0D+0, HALF=0.5D+0,
  9930. C    1     KAPPA=2.0D+0, NEGONE=-1.0D+0, ONE=1.0D+0, P001=1.0D-3,
  9931. C    2     SIX=6.0D+0, THREE=3.0D+0, TWO=2.0D+0, ZERO=0.0D+0)
  9932. C     SAVE DGXFAC
  9933. C/
  9934.       DATA DGXFAC/0.D+0/
  9935. C
  9936. C  ***  BODY  ***
  9937. C
  9938. C     ***  STORE LARGEST ABS. ENTRY IN (D**-1)*H*(D**-1) AT W(DGGDMX).
  9939.       DGGDMX = P + 1
  9940. C     ***  STORE GERSCHGORIN OVER- AND UNDERESTIMATES OF THE LARGEST
  9941. C     ***  AND SMALLEST EIGENVALUES OF (D**-1)*H*(D**-1) AT W(EMAX)
  9942. C     ***  AND W(EMIN) RESPECTIVELY.
  9943.       EMAX = DGGDMX + 1
  9944.       EMIN = EMAX + 1
  9945. C     ***  FOR USE IN RECOMPUTING STEP, THE FINAL VALUES OF LK, UK, DST,
  9946. C     ***  AND THE INVERSE DERIVATIVE OF MORE*S PHI AT 0 (FOR POS. DEF.
  9947. C     ***  H) ARE STORED IN W(LK0), W(UK0), W(DSTSAV), AND W(PHIPIN)
  9948. C     ***  RESPECTIVELY.
  9949.       LK0 = EMIN + 1
  9950.       PHIPIN = LK0 + 1
  9951.       UK0 = PHIPIN + 1
  9952.       DSTSAV = UK0 + 1
  9953. C     ***  STORE DIAG OF (D**-1)*H*(D**-1) IN W(DIAG),...,W(DIAG0+P).
  9954.       DIAG0 = DSTSAV
  9955.       DIAG = DIAG0 + 1
  9956. C     ***  STORE -D*STEP IN W(Q),...,W(Q0+P).
  9957.       Q0 = DIAG0 + P
  9958.       Q = Q0 + 1
  9959.       RAD = V(RADIUS)
  9960. C     ***  PHITOL = MAX. ERROR ALLOWED IN DST = V(DSTNRM) = 2-NORM OF
  9961. C     ***  D*STEP.
  9962.       PHIMAX = V(PHMXFC) * RAD
  9963.       PHIMIN = V(PHMNFC) * RAD
  9964. C     ***  EPSO6 AND PSIFAC ARE USED IN CHECKING FOR THE SPECIAL CASE
  9965. C     ***  OF (NEARLY) SINGULAR H + ALPHA*D**2 (SEE REF. 2).
  9966.       PSIFAC = TWO * V(EPSLON) / (THREE * (FOUR * (V(PHMNFC) + ONE) *
  9967.      1                       (KAPPA + ONE)  +  KAPPA  +  TWO) * RAD**2)
  9968. C     ***  OLDPHI IS USED TO DETECT LIMITS OF NUMERICAL ACCURACY.  IF
  9969. C     ***  WE RECOMPUTE STEP AND IT DOES NOT CHANGE, THEN WE ACCEPT IT.
  9970.       OLDPHI = ZERO
  9971.       EPSO6 = V(EPSLON)/SIX
  9972.       IRC = 0
  9973.       RESTRT = .FALSE.
  9974.       KALIM = KA + 50
  9975. C
  9976. C  ***  START OR RESTART, DEPENDING ON KA  ***
  9977. C
  9978.       IF (KA .GE. 0) GO TO 310
  9979. C
  9980. C  ***  FRESH START  ***
  9981. C
  9982.       K = 0
  9983.       UK = NEGONE
  9984.       KA = 0
  9985.       KALIM = 50
  9986. C
  9987. C     ***  STORE DIAG(DIHDI) IN W(DIAG0+1),...,W(DIAG0+P)  ***
  9988. C
  9989.       J = 0
  9990.       DO 20 I = 1, P
  9991.          J = J + I
  9992.          K1 = DIAG0 + I
  9993.          W(K1) = DIHDI(J)
  9994.  20      CONTINUE
  9995. C
  9996. C     ***  DETERMINE W(DGGDMX), THE LARGEST ELEMENT OF DIHDI  ***
  9997. C
  9998.       T1 = ZERO
  9999.       J = P * (P + 1) / 2
  10000.       DO 30 I = 1, J
  10001.          T = DABS(DIHDI(I))
  10002.          IF (T1 .LT. T) T1 = T
  10003.  30      CONTINUE
  10004.       W(DGGDMX) = T1
  10005. C
  10006. C  ***  TRY ALPHA = 0  ***
  10007. C
  10008.  40   CALL LSQRT(1, P, L, DIHDI, IRC)
  10009.       IF (IRC .EQ. 0) GO TO 60
  10010. C        ***  INDEF. H -- UNDERESTIMATE SMALLEST EIGENVALUE, USE THIS
  10011. C        ***  ESTIMATE TO INITIALIZE LOWER BOUND LK ON ALPHA.
  10012.          J = IRC*(IRC+1)/2
  10013.          T = L(J)
  10014.          L(J) = ONE
  10015.          DO 50 I = 1, IRC
  10016.  50           W(I) = ZERO
  10017.          W(IRC) = ONE
  10018.          CALL LITVMU(IRC, W, L, W)
  10019.          T1 = V2NORM(IRC, W)
  10020.          LK = -T / T1 / T1
  10021.          V(DST0) = -LK
  10022.          IF (RESTRT) GO TO 210
  10023.          V(NREDUC) = ZERO
  10024.          GO TO 70
  10025. C
  10026. C     ***  POSITIVE DEFINITE H -- COMPUTE UNMODIFIED NEWTON STEP.  ***
  10027.  60   LK = ZERO
  10028.       CALL LIVMUL(P, W(Q), L, DIG)
  10029.       V(NREDUC) = HALF * DOTPRD(P, W(Q), W(Q))
  10030.       CALL LITVMU(P, W(Q), L, W(Q))
  10031.       DST = V2NORM(P, W(Q))
  10032.       V(DST0) = DST
  10033.       PHI = DST - RAD
  10034.       IF (PHI .LE. PHIMAX) GO TO 280
  10035.       IF (RESTRT) GO TO 210
  10036. C
  10037. C  ***  PREPARE TO COMPUTE GERSCHGORIN ESTIMATES OF LARGEST (AND
  10038. C  ***  SMALLEST) EIGENVALUES.  ***
  10039. C
  10040.  70   V(DGNORM) = V2NORM(P, DIG)
  10041.       IF (V(DGNORM) .EQ. ZERO) GO TO 450
  10042.       K = 0
  10043.       DO 100 I = 1, P
  10044.          WI = ZERO
  10045.          IF (I .EQ. 1) GO TO 90
  10046.          IM1 = I - 1
  10047.          DO 80 J = 1, IM1
  10048.               K = K + 1
  10049.               T = DABS(DIHDI(K))
  10050.               WI = WI + T
  10051.               W(J) = W(J) + T
  10052.  80           CONTINUE
  10053.  90      W(I) = WI
  10054.          K = K + 1
  10055.  100     CONTINUE
  10056. C
  10057. C  ***  (UNDER-)ESTIMATE SMALLEST EIGENVALUE OF (D**-1)*H*(D**-1)  ***
  10058. C
  10059.       K = 1
  10060.       T1 = W(DIAG) - W(1)
  10061.       IF (P .LE. 1) GO TO 120
  10062.       DO 110 I = 2, P
  10063.          J = DIAG0 + I
  10064.          T = W(J) - W(I)
  10065.          IF (T .GE. T1) GO TO 110
  10066.               T1 = T
  10067.               K = I
  10068.  110     CONTINUE
  10069. C
  10070.  120  SK = W(K)
  10071.       J = DIAG0 + K
  10072.       AKK = W(J)
  10073.       K1 = K*(K-1)/2 + 1
  10074.       INC = 1
  10075.       T = ZERO
  10076.       DO 150 I = 1, P
  10077.          IF (I .EQ. K) GO TO 130
  10078.          AKI = DABS(DIHDI(K1))
  10079.          SI = W(I)
  10080.          J = DIAG0 + I
  10081.          T1 = HALF * (AKK - W(J) + SI - AKI)
  10082.          T1 = T1 + DSQRT(T1*T1 + SK*AKI)
  10083.          IF (T .LT. T1) T = T1
  10084.          IF (I .LT. K) GO TO 140
  10085.  130     INC = I
  10086.  140     K1 = K1 + INC
  10087.  150     CONTINUE
  10088. C
  10089.       W(EMIN) = AKK - T
  10090.       UK = V(DGNORM)/RAD - W(EMIN)
  10091. C
  10092. C  ***  COMPUTE GERSCHGORIN (OVER-)ESTIMATE OF LARGEST EIGENVALUE  ***
  10093. C
  10094.       K = 1
  10095.       T1 = W(DIAG) + W(1)
  10096.       IF (P .LE. 1) GO TO 170
  10097.       DO 160 I = 2, P
  10098.          J = DIAG0 + I
  10099.          T = W(J) + W(I)
  10100.          IF (T .LE. T1) GO TO 160
  10101.               T1 = T
  10102.               K = I
  10103.  160     CONTINUE
  10104. C
  10105.  170  SK = W(K)
  10106.       J = DIAG0 + K
  10107.       AKK = W(J)
  10108.       K1 = K*(K-1)/2 + 1
  10109.       INC = 1
  10110.       T = ZERO
  10111.       DO 200 I = 1, P
  10112.          IF (I .EQ. K) GO TO 180
  10113.          AKI = DABS(DIHDI(K1))
  10114.          SI = W(I)
  10115.          J = DIAG0 + I
  10116.          T1 = HALF * (W(J) + SI - AKI - AKK)
  10117.          T1 = T1 + DSQRT(T1*T1 + SK*AKI)
  10118.          IF (T .LT. T1) T = T1
  10119.          IF (I .LT. K) GO TO 190
  10120.  180     INC = I
  10121.  190     K1 = K1 + INC
  10122.  200     CONTINUE
  10123. C
  10124.       W(EMAX) = AKK + T
  10125.       LK = DMAX1(LK, V(DGNORM)/RAD - W(EMAX))
  10126. C
  10127. C     ***  ALPHAK = CURRENT VALUE OF ALPHA (SEE ALG. NOTES ABOVE).  WE
  10128. C     ***  USE MORE*S SCHEME FOR INITIALIZING IT.
  10129.       ALPHAK = DABS(V(STPPAR)) * V(RAD0)/RAD
  10130. C
  10131.       IF (IRC .NE. 0) GO TO 210
  10132. C
  10133. C  ***  COMPUTE L0 FOR POSITIVE DEFINITE H  ***
  10134. C
  10135.       CALL LIVMUL(P, W, L, W(Q))
  10136.       T = V2NORM(P, W)
  10137.       W(PHIPIN) = DST / T / T
  10138.       LK = DMAX1(LK, PHI*W(PHIPIN))
  10139. C
  10140. C  ***  SAFEGUARD ALPHAK AND ADD ALPHAK*I TO (D**-1)*H*(D**-1)  ***
  10141. C
  10142.  210  KA = KA + 1
  10143.       IF (-V(DST0) .GE. ALPHAK .OR. ALPHAK .LT. LK .OR. ALPHAK .GE. UK)
  10144.      1                      ALPHAK = UK * DMAX1(P001, DSQRT(LK/UK))
  10145.       K = 0
  10146.       DO 220 I = 1, P
  10147.          K = K + I
  10148.          J = DIAG0 + I
  10149.          DIHDI(K) = W(J) + ALPHAK
  10150.  220     CONTINUE
  10151. C
  10152. C  ***  TRY COMPUTING CHOLESKY DECOMPOSITION  ***
  10153. C
  10154.       CALL LSQRT(1, P, L, DIHDI, IRC)
  10155.       IF (IRC .EQ. 0) GO TO 250
  10156. C
  10157. C  ***  (D**-1)*H*(D**-1) + ALPHAK*I  IS INDEFINITE -- OVERESTIMATE
  10158. C  ***  SMALLEST EIGENVALUE FOR USE IN UPDATING LK  ***
  10159. C
  10160.       J = (IRC*(IRC+1))/2
  10161.       T = L(J)
  10162.       L(J) = ONE
  10163.       DO 230 I = 1, IRC
  10164.  230     W(I) = ZERO
  10165.       W(IRC) = ONE
  10166.       CALL LITVMU(IRC, W, L, W)
  10167.       T1 = V2NORM(IRC, W)
  10168.       LK = ALPHAK - T/T1/T1
  10169.       V(DST0) = -LK
  10170.       GO TO 210
  10171. C
  10172. C  ***  ALPHAK MAKES (D**-1)*H*(D**-1) POSITIVE DEFINITE.
  10173. C  ***  COMPUTE Q = -D*STEP, CHECK FOR CONVERGENCE.  ***
  10174. C
  10175.  250  CALL LIVMUL(P, W(Q), L, DIG)
  10176.       CALL LITVMU(P, W(Q), L, W(Q))
  10177.       DST = V2NORM(P, W(Q))
  10178.       PHI = DST - RAD
  10179.       IF (PHI .LE. PHIMAX .AND. PHI .GE. PHIMIN) GO TO 290
  10180.       IF (PHI .EQ. OLDPHI) GO TO 290
  10181.       OLDPHI = PHI
  10182.       IF (PHI .GT. ZERO) GO TO 260
  10183. C        ***  CHECK FOR THE SPECIAL CASE OF  H + ALPHA*D**2  (NEARLY)
  10184. C        ***  SINGULAR.  DELTA IS .GE. THE SMALLEST EIGENVALUE OF
  10185. C        ***  (D**-1)*H*(D**-1) + ALPHAK*I.
  10186.          IF (V(DST0) .GT. ZERO) GO TO 260
  10187.          DELTA = ALPHAK + V(DST0)
  10188.          TWOPSI = ALPHAK*DST*DST + DOTPRD(P, DIG, W(Q))
  10189.          IF (DELTA .LT. PSIFAC*TWOPSI) GO TO 270
  10190. C
  10191. C  ***  UNACCEPTABLE ALPHAK -- UPDATE LK, UK, ALPHAK  ***
  10192. C
  10193.  260  IF (KA .GE. KALIM) GO TO 290
  10194.       CALL LIVMUL(P, W, L, W(Q))
  10195.       T1 = V2NORM(P, W)
  10196. C     ***  THE FOLLOWING DMIN1 IS NECESSARY BECAUSE OF RESTARTS  ***
  10197.       IF (PHI .LT. ZERO) UK = DMIN1(UK, ALPHAK)
  10198.       ALPHAK = ALPHAK  +  (PHI/T1) * (DST/T1) * (DST/RAD)
  10199.       LK = DMAX1(LK, ALPHAK)
  10200.       GO TO 210
  10201. C
  10202. C  ***  DECIDE HOW TO HANDLE (NEARLY) SINGULAR H + ALPHA*D**2  ***
  10203. C
  10204. C     ***  IF NOT YET AVAILABLE, OBTAIN MACHINE DEPENDENT VALUE DGXFAC.
  10205.  270  IF (DGXFAC .EQ. ZERO) DGXFAC = EPSFAC * RMDCON(3)
  10206. C
  10207. C     ***  NOW DECIDE.  ***
  10208.       IF (DELTA .GT. DGXFAC*W(DGGDMX)) GO TO 350
  10209. C        ***  DELTA IS SO SMALL WE CANNOT HANDLE THE SPECIAL CASE IN
  10210. C        ***  THE AVAILABLE ARITHMETIC.  ACCEPT STEP AS IT IS.
  10211.          GO TO 290
  10212. C
  10213. C  ***  ACCEPTABLE STEP ON FIRST TRY  ***
  10214. C
  10215.  280  ALPHAK = ZERO
  10216. C
  10217. C  ***  SUCCESSFUL STEP IN GENERAL.  COMPUTE STEP = -(D**-1)*Q  ***
  10218. C
  10219.  290  DO 300 I = 1, P
  10220.          J = Q0 + I
  10221.          STEP(I) = -W(J)/D(I)
  10222.  300     CONTINUE
  10223.       V(GTSTEP) = -DOTPRD(P, DIG, W(Q))
  10224.       V(PREDUC) = HALF * (DABS(ALPHAK)*DST*DST - V(GTSTEP))
  10225.       GO TO 430
  10226. C
  10227. C
  10228. C  ***  RESTART WITH NEW RADIUS  ***
  10229. C
  10230.  310  IF (V(DST0) .LE. ZERO .OR. V(DST0) - RAD .GT. PHIMAX) GO TO 330
  10231. C
  10232. C     ***  PREPARE TO RETURN NEWTON STEP  ***
  10233. C
  10234.          RESTRT = .TRUE.
  10235.          KA = KA + 1
  10236.          K = 0
  10237.          DO 320 I = 1, P
  10238.               K = K + I
  10239.               J = DIAG0 + I
  10240.               DIHDI(K) = W(J)
  10241.  320          CONTINUE
  10242.          UK = NEGONE
  10243.          GO TO 40
  10244. C
  10245.  330  IF (KA .EQ. 0) GO TO 60
  10246. C
  10247.       DST = W(DSTSAV)
  10248.       ALPHAK = DABS(V(STPPAR))
  10249.       PHI = DST - RAD
  10250.       T = V(DGNORM)/RAD
  10251.       IF (RAD .GT. V(RAD0)) GO TO 340
  10252. C
  10253. C        ***  SMALLER RADIUS  ***
  10254.          UK = T - W(EMIN)
  10255.          LK = ZERO
  10256.          IF (ALPHAK .GT. ZERO) LK = W(LK0)
  10257.          LK = DMAX1(LK, T - W(EMAX))
  10258.          IF (V(DST0) .GT. ZERO) LK = DMAX1(LK, (V(DST0)-RAD)*W(PHIPIN))
  10259.          GO TO 260
  10260. C
  10261. C     ***  BIGGER RADIUS  ***
  10262.  340  UK = T - W(EMIN)
  10263.       IF (ALPHAK .GT. ZERO) UK = DMIN1(UK, W(UK0))
  10264.       LK = DMAX1(ZERO, -V(DST0), T - W(EMAX))
  10265.       IF (V(DST0) .GT. ZERO) LK = DMAX1(LK, (V(DST0)-RAD)*W(PHIPIN))
  10266.       GO TO 260
  10267. C
  10268. C  ***  HANDLE (NEARLY) SINGULAR H + ALPHA*D**2  ***
  10269. C
  10270. C     ***  NEGATE ALPHAK TO INDICATE SPECIAL CASE  ***
  10271.  350  ALPHAK = -ALPHAK
  10272. C     ***  ALLOCATE STORAGE FOR SCRATCH VECTOR X  ***
  10273.       X0 = Q0 + P
  10274.       X = X0 + 1
  10275. C
  10276. C  ***  USE INVERSE POWER METHOD WITH START FROM LSVMIN TO OBTAIN
  10277. C  ***  APPROXIMATE EIGENVECTOR CORRESPONDING TO SMALLEST EIGENVALUE
  10278. C  ***  OF (D**-1)*H*(D**-1).
  10279. C
  10280.       DELTA = KAPPA*DELTA
  10281.       T = LSVMIN(P, L, W(X), W)
  10282. C
  10283.       K = 0
  10284. C     ***  NORMALIZE W  ***
  10285.  360  DO 370 I = 1, P
  10286.  370     W(I) = T*W(I)
  10287. C     ***  COMPLETE CURRENT INV. POWER ITER. -- REPLACE W BY (L**-T)*W.
  10288.       CALL LITVMU(P, W, L, W)
  10289.       T1 = ONE/V2NORM(P, W)
  10290.       T = T1*T
  10291.       IF (T .LE. DELTA) GO TO 390
  10292.       IF (K .GT. 30) GO TO 290
  10293.       K = K + 1
  10294. C     ***  START NEXT INV. POWER ITER. BY STORING NORMALIZED W IN X.
  10295.       DO 380 I = 1, P
  10296.          J = X0 + I
  10297.          W(J) = T1*W(I)
  10298.  380     CONTINUE
  10299. C     ***  COMPUTE W = (L**-1)*X.
  10300.       CALL LIVMUL(P, W, L, W(X))
  10301.       T = ONE/V2NORM(P, W)
  10302.       GO TO 360
  10303. C
  10304.  390  DO 400 I = 1, P
  10305.  400     W(I) = T1*W(I)
  10306. C
  10307. C  ***  NOW W IS THE DESIRED APPROXIMATE (UNIT) EIGENVECTOR AND
  10308. C  ***  T*X = ((D**-1)*H*(D**-1) + ALPHAK*I)*W.
  10309. C
  10310.       SW = DOTPRD(P, W(Q), W)
  10311.       T1 = (RAD + DST) * (RAD - DST)
  10312.       ROOT = DSQRT(SW*SW + T1)
  10313.       IF (SW .LT. ZERO) ROOT = -ROOT
  10314.       SI = T1 / (SW + ROOT)
  10315. C     ***  ACCEPT CURRENT STEP IF ADDING SI*W WOULD LEAD TO A
  10316. C     ***  FURTHER RELATIVE REDUCTION IN PSI OF LESS THAN V(EPSLON)/3.
  10317.       V(PREDUC) = HALF*TWOPSI
  10318.       T1 = ZERO
  10319.       T = SI*(ALPHAK*SW - HALF*SI*(ALPHAK + T*DOTPRD(P,W(X),W)))
  10320.       IF (T .LT. EPSO6*TWOPSI) GO TO 410
  10321.          V(PREDUC) = V(PREDUC) + T
  10322.          DST = RAD
  10323.          T1 = -SI
  10324.  410  DO 420 I = 1, P
  10325.          J = Q0 + I
  10326.          W(J) = T1*W(I) - W(J)
  10327.          STEP(I) = W(J) / D(I)
  10328.  420     CONTINUE
  10329.       V(GTSTEP) = DOTPRD(P, DIG, W(Q))
  10330. C
  10331. C  ***  SAVE VALUES FOR USE IN A POSSIBLE RESTART  ***
  10332. C
  10333.  430  V(DSTNRM) = DST
  10334.       V(STPPAR) = ALPHAK
  10335.       W(LK0) = LK
  10336.       W(UK0) = UK
  10337.       V(RAD0) = RAD
  10338.       W(DSTSAV) = DST
  10339. C
  10340. C     ***  RESTORE DIAGONAL OF DIHDI  ***
  10341. C
  10342.       J = 0
  10343.       DO 440 I = 1, P
  10344.          J = J + I
  10345.          K = DIAG0 + I
  10346.          DIHDI(J) = W(K)
  10347.  440     CONTINUE
  10348.       GO TO 999
  10349. C
  10350. C  ***  SPECIAL CASE -- G = 0  ***
  10351. C
  10352.  450  V(STPPAR) = ZERO
  10353.       V(PREDUC) = ZERO
  10354.       V(DSTNRM) = ZERO
  10355.       V(GTSTEP) = ZERO
  10356.       DO 460 I = 1, P
  10357.  460     STEP(I) = ZERO
  10358. C
  10359.  999  RETURN
  10360. C
  10361. C  ***  LAST CARD OF GQTSTP FOLLOWS  ***
  10362.       END
  10363.       SUBROUTINE ITSMRY(D, IV, P, V, X)                                 ITS00010
  10364. C
  10365. C  ***  PRINT NL2SOL (VERSION 2.2) ITERATION SUMMARY  ***
  10366. C
  10367. C  ***  PARAMETER DECLARATIONS  ***
  10368. C
  10369.       INTEGER IV(1), P
  10370.       DOUBLE PRECISION D(P), V(1), X(P)
  10371. C     DIMENSION IV(*), V(*)
  10372. C
  10373. C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  10374. C
  10375. C  ***  LOCAL VARIABLES  ***
  10376. C
  10377.       INTEGER COV1, G1, I, II, IV1, I1, J, M, NF, NG, OL, PU
  10378. C/6
  10379.       REAL MODEL1(6), MODEL2(6)
  10380. C/7
  10381. C     CHARACTER*4 MODEL1(6), MODEL2(6)
  10382. C/
  10383.       DOUBLE PRECISION NRELDF, OLDF, PRELDF, RELDF, ZERO
  10384. C
  10385. C  ***  INTRINSIC FUNCTIONS  ***
  10386. C/+
  10387.       INTEGER IABS
  10388. C/
  10389. C  ***  NO EXTERNAL FUNCTIONS OR SUBROUTINES  ***
  10390. C
  10391. C  ***  SUBSCRIPTS FOR IV AND V  ***
  10392. C
  10393.       INTEGER COVMAT, COVPRT, COVREQ, DSTNRM, F, FDIF, F0, G,
  10394.      1        NEEDHD, NFCALL, NFCOV, NGCOV, NGCALL, NITER, NREDUC,
  10395.      2        OUTLEV, PREDUC, PRNTIT, PRUNIT, RELDX, SIZE, SOLPRT,
  10396.      3        STATPR, STPPAR, SUSED, X0PRT
  10397. C
  10398. C  ***  IV SUBSCRIPT VALUES  ***
  10399. C
  10400. C/6
  10401.       DATA COVMAT/26/, COVPRT/14/, G/28/, COVREQ/15/,
  10402.      1     NEEDHD/39/, NFCALL/6/, NFCOV/40/, NGCOV/41/,
  10403.      2     NGCALL/30/, NITER/31/, OUTLEV/19/, PRNTIT/48/,
  10404.      3     PRUNIT/21/, SOLPRT/22/, STATPR/23/, SUSED/57/,
  10405.      4     X0PRT/24/
  10406. C/7
  10407. C     PARAMETER (COVMAT=26, COVPRT=14, G=28, COVREQ=15,
  10408. C    1     NEEDHD=39, NFCALL=6, NFCOV=40, NGCOV=41,
  10409. C    2     NGCALL=30, NITER=31, OUTLEV=19, PRNTIT=48,
  10410. C    3     PRUNIT=21, SOLPRT=22, STATPR=23, SUSED=57,
  10411. C    4     X0PRT=24)
  10412. C/
  10413. C
  10414. C  ***  V SUBSCRIPT VALUES  ***
  10415. C
  10416. C/6
  10417.       DATA DSTNRM/2/, F/10/, F0/13/, FDIF/11/, NREDUC/6/,
  10418.      1     PREDUC/7/, RELDX/17/, SIZE/47/, STPPAR/5/
  10419. C/7
  10420. C     PARAMETER (DSTNRM=2, F=10, F0=13, FDIF=11, NREDUC=6,
  10421. C    1     PREDUC=7, RELDX=17, SIZE=47, STPPAR=5)
  10422. C/
  10423. C
  10424. C/6
  10425.       DATA ZERO/0.D+0/
  10426. C/7
  10427. C     PARAMETER (ZERO=0.D+0)
  10428. C/
  10429. C/6
  10430.       DATA MODEL1(1)/4H    /, MODEL1(2)/4H    /, MODEL1(3)/4H    /,
  10431.      1     MODEL1(4)/4H    /, MODEL1(5)/4H  G /, MODEL1(6)/4H  S /,
  10432.      2     MODEL2(1)/4H G  /, MODEL2(2)/4H S  /, MODEL2(3)/4HG-S /,
  10433.      3     MODEL2(4)/4HS-G /, MODEL2(5)/4H-S-G/, MODEL2(6)/4H-G-S/
  10434. C/7
  10435. C     DATA MODEL1/'    ','    ','    ','    ','  G ','  S '/,
  10436. C    1     MODEL2/' G  ',' S  ','G-S ','S-G ','-S-G','-G-S'/
  10437. C/
  10438. C
  10439. C-----------------------------------------------------------------------
  10440. C
  10441.       PU = IV(PRUNIT)
  10442.       IF (PU .EQ. 0) GO TO 999
  10443.       IV1 = IV(1)
  10444.       OL = IV(OUTLEV)
  10445.       IF (IV1 .LT. 2 .OR. IV1 .GT. 15) GO TO 140
  10446.       IF (OL .EQ. 0) GO TO 20
  10447.       IF (IV1 .GE. 12) GO TO 20
  10448.       IF (IV1 .GE. 10 .AND. IV(PRNTIT) .EQ. 0) GO TO 20
  10449.       IF (IV1 .GT. 2) GO TO 10
  10450.          IV(PRNTIT) = IV(PRNTIT) + 1
  10451.          IF (IV(PRNTIT) .LT. IABS(OL)) GO TO 999
  10452.  10   NF = IV(NFCALL) - IABS(IV(NFCOV))
  10453.       IV(PRNTIT) = 0
  10454.       RELDF = ZERO
  10455.       PRELDF = ZERO
  10456.       OLDF = V(F0)
  10457.       IF (OLDF .LE. ZERO) GO TO 12
  10458.          RELDF = V(FDIF) / OLDF
  10459.          PRELDF = V(PREDUC) / OLDF
  10460.  12   IF (OL .GT. 0) GO TO 15
  10461. C
  10462. C        ***  PRINT SHORT SUMMARY LINE  ***
  10463. C
  10464.          IF (IV(NEEDHD) .EQ. 1) WRITE(PU, 1010)
  10465.  1010 FORMAT(12H0   IT    NF,6X,1HF,8X,5HRELDF,6X,6HPRELDF,5X,5HRELDX)
  10466.          IV(NEEDHD) = 0
  10467.          WRITE(PU,1017) IV(NITER), NF, V(F), RELDF, PRELDF, V(RELDX)
  10468.          GO TO 20
  10469. C
  10470. C     ***  PRINT LONG SUMMARY LINE  ***
  10471. C
  10472.  15   IF (IV(NEEDHD) .EQ. 1) WRITE(PU,1015)
  10473.  1015 FORMAT(12H0   IT    NF,6X,1HF,8X,5HRELDF,6X,6HPRELDF,5X,5HRELDX,
  10474.      1       4X,15HMODEL    STPPAR,6X,4HSIZE,6X,6HD*STEP,5X,7HNPRELDF)
  10475.       IV(NEEDHD) = 0
  10476.       M = IV(SUSED)
  10477.       NRELDF = ZERO
  10478.       IF (OLDF .GT. ZERO) NRELDF = V(NREDUC) / OLDF
  10479.       WRITE(PU,1017) IV(NITER), NF, V(F), RELDF, PRELDF, V(RELDX),
  10480.      1               MODEL1(M), MODEL2(M), V(STPPAR), V(SIZE),
  10481.      2               V(DSTNRM), NRELDF
  10482.  1017 FORMAT(1X,I5,I6,4D11.3,A3,A4,4D11.3)
  10483. C
  10484.  20   GO TO (999,999,30,35,40,45,50,60,70,80,90,150,110,120,130), IV1
  10485. C
  10486.  30   WRITE(PU,1030)
  10487.  1030 FORMAT(26H0***** X-CONVERGENCE *****)
  10488.       GO TO 180
  10489. C
  10490.  35   WRITE(PU,1035)
  10491.  1035 FORMAT(42H0***** RELATIVE FUNCTION CONVERGENCE *****)
  10492.       GO TO 180
  10493. C
  10494.  40   WRITE(PU,1040)
  10495.  1040 FORMAT(49H0***** X- AND RELATIVE FUNCTION CONVERGENCE *****)
  10496.       GO TO 180
  10497. C
  10498.  45   WRITE(PU,1045)
  10499.  1045 FORMAT(42H0***** ABSOLUTE FUNCTION CONVERGENCE *****)
  10500.       GO TO 180
  10501. C
  10502.  50   WRITE(PU,1050)
  10503.  1050 FORMAT(33H0***** SINGULAR CONVERGENCE *****)
  10504.       GO TO 180
  10505. C
  10506.  60   WRITE(PU,1060)
  10507.  1060 FORMAT(30H0***** FALSE CONVERGENCE *****)
  10508.       GO TO 180
  10509. C
  10510.  70   WRITE(PU,1070)
  10511.  1070 FORMAT(38H0***** FUNCTION EVALUATION LIMIT *****)
  10512.       GO TO 180
  10513. C
  10514.  80   WRITE(PU,1080)
  10515.  1080 FORMAT(28H0***** ITERATION LIMIT *****)
  10516.       GO TO 180
  10517. C
  10518.  90   WRITE(PU,1090)
  10519.  1090 FORMAT(18H0***** STOPX *****)
  10520.       GO TO 180
  10521. C
  10522.  110  WRITE(PU,1100)
  10523.  1100 FORMAT(45H0***** INITIAL SUM OF SQUARES OVERFLOWS *****)
  10524. C
  10525.       GO TO 150
  10526. C
  10527.  120  WRITE(PU,1120)
  10528.  1120 FORMAT(37H0***** BAD PARAMETERS TO ASSESS *****)
  10529.       GO TO 999
  10530. C
  10531.  130  WRITE(PU,1130)
  10532.  1130 FORMAT(36H0***** J COULD NOT BE COMPUTED *****)
  10533.       IF (IV(NITER) .GT. 0) GO TO 190
  10534.       GO TO 150
  10535. C
  10536.  140  WRITE(PU,1140) IV1
  10537.  1140 FORMAT(14H0***** IV(1) =,I5,6H *****)
  10538.       GO TO 999
  10539. C
  10540. C  ***  INITIAL CALL ON ITSMRY  ***
  10541. C
  10542.  150  IF (IV(X0PRT) .NE. 0) WRITE(PU,1150) (I, X(I), D(I), I = 1, P)
  10543.  1150 FORMAT(23H0    I     INITIAL X(I),7X,4HD(I)//(1X,I5,D17.6,D14.3))
  10544.       IF (IV1 .GE. 13) GO TO 999
  10545.       IV(NEEDHD) = 0
  10546.       IV(PRNTIT) = 0
  10547.       IF (OL .EQ. 0) GO TO 999
  10548.       IF (OL .LT. 0) WRITE(PU,1010)
  10549.       IF (OL .GT. 0) WRITE(PU,1015)
  10550.       WRITE(PU,1160) V(F)
  10551.  1160 FORMAT(12H0    0     1,D11.3,11X,D11.3)
  10552.       GO TO 999
  10553. C
  10554. C  ***  PRINT VARIOUS INFORMATION REQUESTED ON SOLUTION  ***
  10555. C
  10556.  180  IV(NEEDHD) = 1
  10557.       IF (IV(STATPR) .EQ. 0) GO TO 190
  10558.          OLDF = V(F0)
  10559.          PRELDF = ZERO
  10560.          NRELDF = ZERO
  10561.          IF (OLDF .LE. ZERO) GO TO 185
  10562.               PRELDF = V(PREDUC) / OLDF
  10563.               NRELDF = V(NREDUC) / OLDF
  10564.  185     NF = IV(NFCALL) - IV(NFCOV)
  10565.          NG = IV(NGCALL) - IV(NGCOV)
  10566.          WRITE(PU,1180) V(F), V(RELDX), NF, NG, PRELDF, NRELDF
  10567.  1180 FORMAT(9H0FUNCTION,D17.6,8H   RELDX,D20.6/12H FUNC. EVALS,
  10568.      1   I8,9X,11HGRAD. EVALS,I8/7H PRELDF,D19.6,3X,7HNPRELDF,D18.6)
  10569. C
  10570.          IF (IV(NFCOV) .GT. 0) WRITE(PU,1185) IV(NFCOV)
  10571.  1185    FORMAT(1H0,I4,34H EXTRA FUNC. EVALS FOR COVARIANCE.)
  10572.          IF (IV(NGCOV) .GT. 0) WRITE(PU,1186) IV(NGCOV)
  10573.  1186    FORMAT(1X,I4,34H EXTRA GRAD. EVALS FOR COVARIANCE.)
  10574. C
  10575.  190  IF (IV(SOLPRT) .EQ. 0) GO TO 210
  10576.          IV(NEEDHD) = 1
  10577.          G1 = IV(G)
  10578.          WRITE(PU,1190)
  10579.  1190 FORMAT(22H0    I      FINAL X(I),8X,4HD(I),10X,4HG(I)/)
  10580.          DO 200 I = 1, P
  10581.               WRITE(PU,1200) I, X(I), D(I), V(G1)
  10582.               G1 = G1 + 1
  10583.  200          CONTINUE
  10584.  1200    FORMAT(1X,I5,D17.6,2D14.3)
  10585. C
  10586.  210  IF (IV(COVPRT) .EQ. 0) GO TO 999
  10587.       COV1 = IV(COVMAT)
  10588.       IV(NEEDHD) = 1
  10589.       IF (COV1) 220, 230, 240
  10590.  220  IF (-1 .EQ. COV1) WRITE(PU,1220)
  10591.  1220 FORMAT(43H0++++++ INDEFINITE COVARIANCE MATRIX ++++++)
  10592.       IF (-2 .EQ. COV1) WRITE(PU,1225)
  10593.  1225 FORMAT(52H0++++++ OVERSIZE STEPS IN COMPUTING COVARIANCE +++++)
  10594.       GO TO 999
  10595. C
  10596.  230  WRITE(PU,1230)
  10597.  1230 FORMAT(45H0++++++ COVARIANCE MATRIX NOT COMPUTED ++++++)
  10598.       GO TO 999
  10599. C
  10600.  240  I = IABS(IV(COVREQ))
  10601.       IF (I .LE. 1) WRITE(PU,1241)
  10602.  1241 FORMAT(48H0COVARIANCE = SCALE * H**-1 * (J**T * J) * H**-1/)
  10603.       IF (I .EQ. 2) WRITE(PU,1242)
  10604.  1242 FORMAT(27H0COVARIANCE = SCALE * H**-1/)
  10605.       IF (I .GE. 3) WRITE(PU,1243)
  10606.  1243 FORMAT(36H0COVARIANCE = SCALE * (J**T * J)**-1/)
  10607.       II = COV1 - 1
  10608.       IF (OL .LE. 0) GO TO 260
  10609.       DO 250 I = 1, P
  10610.          I1 = II + 1
  10611.          II = II + I
  10612.          WRITE(PU,1250) I, (V(J), J = I1, II)
  10613.  250     CONTINUE
  10614.  1250 FORMAT(4H ROW,I3,2X,9D12.4/(9X,9D12.4))
  10615.       GO TO 999
  10616. C
  10617.  260  DO 270 I = 1, P
  10618.          I1 = II + 1
  10619.          II = II + I
  10620.          WRITE(PU,1270) I, (V(J), J = I1, II)
  10621.  270     CONTINUE
  10622.  1270 FORMAT(4H ROW,I3,2X,5D12.4/(9X,5D12.4))
  10623. C
  10624.  999  RETURN
  10625. C  ***  LAST CARD OF ITSMRY FOLLOWS  ***
  10626.       END
  10627.       SUBROUTINE LINVRT(N, LIN, L)                                      LIN00010
  10628. C
  10629. C  ***  COMPUTE  LIN = L**-1,  BOTH  N X N  LOWER TRIANG. STORED   ***
  10630. C  ***  COMPACTLY BY ROWS.  LIN AND L MAY SHARE THE SAME STORAGE.  ***
  10631. C
  10632. C  ***  PARAMETERS  ***
  10633. C
  10634.       INTEGER N
  10635.       DOUBLE PRECISION L(1), LIN(1)
  10636. C     DIMENSION L(N*(N+1)/2), LIN(N*(N+1)/2)
  10637. C
  10638. C  ***  LOCAL VARIABLES  ***
  10639. C
  10640.       INTEGER I, II, IM1, JJ, J0, J1, K, K0, NP1
  10641.       DOUBLE PRECISION ONE, T, ZERO
  10642. C/6
  10643.       DATA ONE/1.D+0/, ZERO/0.D+0/
  10644. C/7
  10645. C     PARAMETER (ONE=1.D+0, ZERO=0.D+0)
  10646. C/
  10647. C
  10648. C  ***  BODY  ***
  10649. C
  10650.       NP1 = N + 1
  10651.       J0 = N*(NP1)/2
  10652.       DO 30 II = 1, N
  10653.          I = NP1 - II
  10654.          LIN(J0) = ONE/L(J0)
  10655.          IF (I .LE. 1) GO TO 999
  10656.          J1 = J0
  10657.          IM1 = I - 1
  10658.          DO 20 JJ = 1, IM1
  10659.               T = ZERO
  10660.               J0 = J1
  10661.               K0 = J1 - JJ
  10662.               DO 10 K = 1, JJ
  10663.                    T = T - L(K0)*LIN(J0)
  10664.                    J0 = J0 - 1
  10665.                    K0 = K0 + K - I
  10666.  10                CONTINUE
  10667.               LIN(J0) = T/L(K0)
  10668.  20           CONTINUE
  10669.          J0 = J0 - 1
  10670.  30      CONTINUE
  10671.  999  RETURN
  10672. C  ***  LAST CARD OF LINVRT FOLLOWS  ***
  10673.       END
  10674.       SUBROUTINE LITVMU(N, X, L, Y)                                     LIT00010
  10675. C
  10676. C  ***  SOLVE  (L**T)*X = Y,  WHERE  L  IS AN  N X N  LOWER TRIANGULAR
  10677. C  ***  MATRIX STORED COMPACTLY BY ROWS.  X AND Y MAY OCCUPY THE SAME
  10678. C  ***  STORAGE.  ***
  10679. C
  10680.       INTEGER N
  10681.       DOUBLE PRECISION X(N), L(1), Y(N)
  10682.       INTEGER I, II, IJ, IM1, I0, J, NP1
  10683.       DOUBLE PRECISION XI, ZERO
  10684. C/6
  10685.       DATA ZERO/0.D+0/
  10686. C/7
  10687. C     PARAMETER (ZERO=0.D+0)
  10688. C/
  10689. C
  10690.       DO 10 I = 1, N
  10691.  10      X(I) = Y(I)
  10692.       NP1 = N + 1
  10693.       I0 = N*(N+1)/2
  10694.       DO 30 II = 1, N
  10695.          I = NP1 - II
  10696.          XI = X(I)/L(I0)
  10697.          X(I) = XI
  10698.          IF (I .LE. 1) GO TO 999
  10699.          I0 = I0 - I
  10700.          IF (XI .EQ. ZERO) GO TO 30
  10701.          IM1 = I - 1
  10702.          DO 20 J = 1, IM1
  10703.               IJ = I0 + J
  10704.               X(J) = X(J) - XI*L(IJ)
  10705.  20           CONTINUE
  10706.  30      CONTINUE
  10707.  999  RETURN
  10708. C  ***  LAST CARD OF LITVMU FOLLOWS  ***
  10709.       END
  10710.       SUBROUTINE LIVMUL(N, X, L, Y)                                     LIV00010
  10711. C
  10712. C  ***  SOLVE  L*X = Y, WHERE  L  IS AN  N X N  LOWER TRIANGULAR
  10713. C  ***  MATRIX STORED COMPACTLY BY ROWS.  X AND Y MAY OCCUPY THE SAME
  10714. C  ***  STORAGE.  ***
  10715. C
  10716.       INTEGER N
  10717.       DOUBLE PRECISION X(N), L(1), Y(N)
  10718.       EXTERNAL DOTPRD
  10719.       DOUBLE PRECISION DOTPRD
  10720.       INTEGER I, J, K
  10721.       DOUBLE PRECISION T, ZERO
  10722. C/6
  10723.       DATA ZERO/0.D+0/
  10724. C/7
  10725. C     PARAMETER (ZERO=0.D+0)
  10726. C/
  10727. C
  10728.       DO 10 K = 1, N
  10729.          IF (Y(K) .NE. ZERO) GO TO 20
  10730.          X(K) = ZERO
  10731.  10      CONTINUE
  10732.       GO TO 999
  10733.  20   J = K*(K+1)/2
  10734.       X(K) = Y(K) / L(J)
  10735.       IF (K .GE. N) GO TO 999
  10736.       K = K + 1
  10737.       DO 30 I = K, N
  10738.          T = DOTPRD(I-1, L(J+1), X)
  10739.          J = J + I
  10740.          X(I) = (Y(I) - T)/L(J)
  10741.  30      CONTINUE
  10742.  999  RETURN
  10743. C  ***  LAST CARD OF LIVMUL FOLLOWS  ***
  10744.       END
  10745.       SUBROUTINE LMSTEP(D, G, IERR, IPIVOT, KA, P, QTR, R, STEP, V, W)  LMS00010
  10746. C
  10747. C  ***  COMPUTE LEVENBERG-MARQUARDT STEP USING MORE-HEBDEN TECHNIQUE  **
  10748. C  ***  NL2SOL VERSION 2.2.  ***
  10749. C
  10750. C  ***  PARAMETER DECLARATIONS  ***
  10751. C
  10752.       INTEGER IERR, KA, P
  10753.       INTEGER IPIVOT(P)
  10754.       DOUBLE PRECISION D(P), G(P), QTR(P), R(1), STEP(P), V(21), W(1)
  10755. C     DIMENSION W(P*(P+5)/2 + 4)
  10756. C
  10757. C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  10758. C
  10759. C  ***  PURPOSE  ***
  10760. C
  10761. C        GIVEN THE R MATRIX FROM THE QR DECOMPOSITION OF A JACOBIAN
  10762. C     MATRIX, J, AS WELL AS Q-TRANSPOSE TIMES THE CORRESPONDING
  10763. C     RESIDUAL VECTOR, RESID, THIS SUBROUTINE COMPUTES A LEVENBERG-
  10764. C     MARQUARDT STEP OF APPROXIMATE LENGTH V(RADIUS) BY THE MORE-
  10765. C     TECHNIQUE.
  10766. C
  10767. C  ***  PARAMETER DESCRIPTION  ***
  10768. C
  10769. C      D (IN)  = THE SCALE VECTOR.
  10770. C      G (IN)  = THE GRADIENT VECTOR (J**T)*R.
  10771. C   IERR (I/O) = RETURN CODE FROM QRFACT OR QRFGS -- 0 MEANS R HAS
  10772. C             FULL RANK.
  10773. C IPIVOT (I/O) = PERMUTATION ARRAY FROM QRFACT OR QRFGS, WHICH COMPUTE
  10774. C             QR DECOMPOSITIONS WITH COLUMN PIVOTING.
  10775. C     KA (I/O).  KA .LT. 0 ON INPUT MEANS THIS IS THE FIRST CALL ON
  10776. C             LMSTEP FOR THE CURRENT R AND QTR.  ON OUTPUT KA CON-
  10777. C             TAINS THE NUMBER OF HEBDEN ITERATIONS NEEDED TO DETERMINE
  10778. C             STEP.  KA = 0 MEANS A GAUSS-NEWTON STEP.
  10779. C      P (IN)  = NUMBER OF PARAMETERS.
  10780. C    QTR (IN)  = (Q**T)*RESID = Q-TRANSPOSE TIMES THE RESIDUAL VECTOR.
  10781. C      R (IN)  = THE R MATRIX, STORED COMPACTLY BY COLUMNS.
  10782. C   STEP (OUT) = THE LEVENBERG-MARQUARDT STEP COMPUTED.
  10783. C      V (I/O) CONTAINS VARIOUS CONSTANTS AND VARIABLES DESCRIBED BELOW.
  10784. C      W (I/O) = WORKSPACE OF LENGTH P*(P+5)/2 + 4.
  10785. C
  10786. C  ***  ENTRIES IN V  ***
  10787. C
  10788. C V(DGNORM) (I/O) = 2-NORM OF (D**-1)*G.
  10789. C V(DSTNRM) (I/O) = 2-NORM OF D*STEP.
  10790. C V(DST0)   (I/O) = 2-NORM OF GAUSS-NEWTON STEP (FOR NONSING. J).
  10791. C V(EPSLON) (IN) = MAX. REL. ERROR ALLOWED IN TWONORM(R)**2 MINUS
  10792. C             TWONORM(R - J*STEP)**2.  (SEE ALGORITHM NOTES BELOW.)
  10793. C V(GTSTEP) (OUT) = INNER PRODUCT BETWEEN G AND STEP.
  10794. C V(NREDUC) (OUT) = HALF THE REDUCTION IN THE SUM OF SQUARES PREDICTED
  10795. C             FOR A GAUSS-NEWTON STEP.
  10796. C V(PHMNFC) (IN)  = TOL. (TOGETHER WITH V(PHMXFC)) FOR ACCEPTING STEP
  10797. C             (MORE*S SIGMA).  THE ERROR V(DSTNRM) - V(RADIUS) MUST LIE
  10798. C             BETWEEN V(PHMNFC)*V(RADIUS) AND V(PHMXFC)*V(RADIUS).
  10799. C V(PHMXFC) (IN)  (SEE V(PHMNFC).)
  10800. C V(PREDUC) (OUT) = HALF THE REDUCTION IN THE SUM OF SQUARES PREDICTED
  10801. C             BY THE STEP RETURNED.
  10802. C V(RADIUS) (IN)  = RADIUS OF CURRENT (SCALED) TRUST REGION.
  10803. C V(RAD0)   (I/O) = VALUE OF V(RADIUS) FROM PREVIOUS CALL.
  10804. C V(STPPAR) (I/O) = MARQUARDT PARAMETER (OR ITS NEGATIVE IF THE SPECIAL
  10805. C             CASE MENTIONED BELOW IN THE ALGORITHM NOTES OCCURS).
  10806. C
  10807. C NOTE -- SEE DATA STATEMENT BELOW FOR VALUES OF ABOVE SUBSCRIPTS.
  10808. C
  10809. C  ***  USAGE NOTES  ***
  10810. C
  10811. C     IF IT IS DESIRED TO RECOMPUTE STEP USING A DIFFERENT VALUE OF
  10812. C     V(RADIUS), THEN THIS ROUTINE MAY BE RESTARTED BY CALLING IT
  10813. C     WITH ALL PARAMETERS UNCHANGED EXCEPT V(RADIUS).  (THIS EXPLAINS
  10814. C     WHY MANY PARAMETERS ARE LISTED AS I/O).  ON AN INTIIAL CALL (ONE
  10815. C     WITH KA = -1), THE CALLER NEED ONLY HAVE INITIALIZED D, G, KA, P,
  10816. C     QTR, R, V(EPSLON), V(PHMNFC), V(PHMXFC), V(RADIUS), AND V(RAD0).
  10817. C
  10818. C  ***  APPLICATION AND USAGE RESTRICTIONS  ***
  10819. C
  10820. C     THIS ROUTINE IS CALLED AS PART OF THE NL2SOL (NONLINEAR LEAST-
  10821. C     SQUARES) PACKAGE (REF. 1).
  10822. C
  10823. C  ***  ALGORITHM NOTES  ***
  10824. C
  10825. C     THIS CODE IMPLEMENTS THE STEP COMPUTATION SCHEME DESCRIBED IN
  10826. C     REFS. 2 AND 4.  FAST GIVENS TRANSFORMATIONS (SEE REF. 3, PP. 60-
  10827. C     62) ARE USED TO COMPUTE STEP WITH A NONZERO MARQUARDT PARAMETER.
  10828. C        A SPECIAL CASE OCCURS IF J IS (NEARLY) SINGULAR AND V(RADIUS)
  10829. C     IS SUFFICIENTLY LARGE.  IN THIS CASE THE STEP RETURNED IS SUCH
  10830. C     THAT  TWONORM(R)**2 - TWONORM(R - J*STEP)**2  DIFFERS FROM ITS
  10831. C     OPTIMAL VALUE BY LESS THAN V(EPSLON) TIMES THIS OPTIMAL VALUE,
  10832. C     WHERE J AND R DENOTE THE ORIGINAL JACOBIAN AND RESIDUAL.  (SEE
  10833. C     REF. 2 FOR MORE DETAILS.)
  10834. C
  10835. C  ***  FUNCTIONS AND SUBROUTINES CALLED  ***
  10836. C
  10837. C DOTPRD - RETURNS INNER PRODUCT OF TWO VECTORS.
  10838. C LITVMU - APPLY INVERSE-TRANSPOSE OF COMPACT LOWER TRIANG. MATRIX.
  10839. C LIVMUL - APPLY INVERSE OF COMPACT LOWER TRIANG. MATRIX.
  10840. C VCOPY  - COPIES ONE VECTOR TO ANOTHER.
  10841. C V2NORM - RETURNS 2-NORM OF A VECTOR.
  10842. C
  10843. C  ***  REFERENCES  ***
  10844. C
  10845. C 1.  DENNIS, J.E., GAY, D.M., AND WELSCH, R.E. (1981), AN ADAPTIVE
  10846. C             NONLINEAR LEAST-SQUARES ALGORITHM, ACM TRANS. MATH.
  10847. C             SOFTWARE, VOL. 7, NO. 3.
  10848. C 2.  GAY, D.M. (1981), COMPUTING OPTIMAL LOCALLY CONSTRAINED STEPS,
  10849. C             SIAM J. SCI. STATIST. COMPUTING, VOL. 2, NO. 2, PP.
  10850. C             186-197.
  10851. C 3.  LAWSON, C.L., AND HANSON, R.J. (1974), SOLVING LEAST SQUARES
  10852. C             PROBLEMS, PRENTICE-HALL, ENGLEWOOD CLIFFS, N.J.
  10853. C 4.  MORE, J.J. (1978), THE LEVENBERG-MARQUARDT ALGORITHM, IMPLEMEN-
  10854. C             TATION AND THEORY, PP.105-116 OF SPRINGER LECTURE NOTES
  10855. C             IN MATHEMATICS NO. 630, EDITED BY G.A. WATSON, SPRINGER-
  10856. C             VERLAG, BERLIN AND NEW YORK.
  10857. C
  10858. C  ***  GENERAL  ***
  10859. C
  10860. C     CODED BY DAVID M. GAY.
  10861. C     THIS SUBROUTINE WAS WRITTEN IN CONNECTION WITH RESEARCH
  10862. C     SUPPORTED BY THE NATIONAL SCIENCE FOUNDATION UNDER GRANTS
  10863. C     MCS-7600324, DCR75-10143, 76-14311DSS, MCS76-11989, AND
  10864. C     MCS-7906671.
  10865. C
  10866. C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  10867. C
  10868. C  ***  LOCAL VARIABLES  ***
  10869. C
  10870.       INTEGER DSTSAV, I, IP1, I1, J1, K, KALIM, L, LK0, PHIPIN,
  10871.      1        PP1O2, RES, RES0, RMAT, RMAT0, UK0
  10872.       DOUBLE PRECISION A, ADI, ALPHAK, B, DFACSQ, DST, DTOL, D1, D2,
  10873.      1                 LK, OLDPHI, PHI, PHIMAX, PHIMIN, PSIFAC, RAD,
  10874.      2                 SI, SJ, SQRTAK, T, TWOPSI, UK, WL
  10875. C
  10876. C     ***  CONSTANTS  ***
  10877.       DOUBLE PRECISION DFAC, EIGHT, HALF, NEGONE, ONE, P001, THREE,
  10878.      1                 TTOL, ZERO
  10879. C
  10880. C  ***  INTRINSIC FUNCTIONS  ***
  10881. C/+
  10882.       INTEGER IABS
  10883.       DOUBLE PRECISION DABS, DMAX1, DMIN1, DSQRT
  10884. C/
  10885. C  ***  EXTERNAL FUNCTIONS AND SUBROUTINES  ***
  10886. C
  10887.       EXTERNAL DOTPRD, LITVMU, LIVMUL, VCOPY, V2NORM
  10888.       DOUBLE PRECISION DOTPRD, V2NORM
  10889. C
  10890. C  ***  SUBSCRIPTS FOR V  ***
  10891. C
  10892.       INTEGER DGNORM, DSTNRM, DST0, EPSLON, GTSTEP, NREDUC, PHMNFC,
  10893.      1        PHMXFC, PREDUC, RADIUS, RAD0, STPPAR
  10894. C/6
  10895.       DATA DGNORM/1/, DSTNRM/2/, DST0/3/, EPSLON/19/,
  10896.      1     GTSTEP/4/, NREDUC/6/, PHMNFC/20/,
  10897.      2     PHMXFC/21/, PREDUC/7/, RADIUS/8/,
  10898.      3     RAD0/9/, STPPAR/5/
  10899. C/7
  10900. C     PARAMETER (DGNORM=1, DSTNRM=2, DST0=3, EPSLON=19,
  10901. C    1     GTSTEP=4, NREDUC=6, PHMNFC=20,
  10902. C    2     PHMXFC=21, PREDUC=7, RADIUS=8,
  10903. C    3     RAD0=9, STPPAR=5)
  10904. C/
  10905. C
  10906. C/6
  10907.       DATA DFAC/256.D+0/, EIGHT/8.D+0/, HALF/0.5D+0/, NEGONE/-1.D+0/,
  10908.      1     ONE/1.D+0/, P001/1.D-3/, THREE/3.D+0/, TTOL/2.5D+0/,
  10909.      2     ZERO/0.D+0/
  10910. C/7
  10911. C     PARAMETER (DFAC=256.D+0, EIGHT=8.D+0, HALF=0.5D+0, NEGONE=-1.D+0,
  10912. C    1     ONE=1.D+0, P001=1.D-3, THREE=3.D+0, TTOL=2.5D+0,
  10913. C    2     ZERO=0.D+0)
  10914. C/
  10915. C
  10916. C  ***  BODY  ***
  10917. C
  10918. C     ***  FOR USE IN RECOMPUTING STEP, THE FINAL VALUES OF LK AND UK,
  10919. C     ***  THE INVERSE DERIVATIVE OF MORE*S PHI AT 0 (FOR NONSING. J)
  10920. C     ***  AND THE VALUE RETURNED AS V(DSTNRM) ARE STORED AT W(LK0),
  10921. C     ***  W(UK0), W(PHIPIN), AND W(DSTSAV) RESPECTIVELY.
  10922.       LK0 = P + 1
  10923.       PHIPIN = LK0 + 1
  10924.       UK0 = PHIPIN + 1
  10925.       DSTSAV = UK0 + 1
  10926.       RMAT0 = DSTSAV
  10927. C     ***  A COPY OF THE R-MATRIX FROM THE QR DECOMPOSITION OF J IS
  10928. C     ***  STORED IN W STARTING AT W(RMAT), AND A COPY OF THE RESIDUAL
  10929. C     ***  VECTOR IS STORED IN W STARTING AT W(RES).  THE LOOPS BELOW
  10930. C     ***  THAT UPDATE THE QR DECOMP. FOR A NONZERO MARQUARDT PARAMETER
  10931. C     ***  WORK ON THESE COPIES.
  10932.       RMAT = RMAT0 + 1
  10933.       PP1O2 = P * (P + 1) / 2
  10934.       RES0 = PP1O2 + RMAT0
  10935.       RES = RES0 + 1
  10936.       RAD = V(RADIUS)
  10937.       IF (RAD .GT. ZERO)
  10938.      1   PSIFAC = V(EPSLON)/((EIGHT*(V(PHMNFC) + ONE) + THREE) * RAD**2)
  10939.       PHIMAX = V(PHMXFC) * RAD
  10940.       PHIMIN = V(PHMNFC) * RAD
  10941. C     ***  DTOL, DFAC, AND DFACSQ ARE USED IN RESCALING THE FAST GIVENS
  10942. C     ***  REPRESENTATION OF THE UPDATED QR DECOMPOSITION.
  10943.       DTOL = ONE/DFAC
  10944.       DFACSQ = DFAC*DFAC
  10945. C     ***  OLDPHI IS USED TO DETECT LIMITS OF NUMERICAL ACCURACY.  IF
  10946. C     ***  WE RECOMPUTE STEP AND IT DOES NOT CHANGE, THEN WE ACCEPT IT.
  10947.       OLDPHI = ZERO
  10948.       LK = ZERO
  10949.       UK = ZERO
  10950.       KALIM = KA + 12
  10951. C
  10952. C  ***  START OR RESTART, DEPENDING ON KA  ***
  10953. C
  10954.       IF (KA) 10, 20, 370
  10955. C
  10956. C  ***  FRESH START -- COMPUTE V(NREDUC)  ***
  10957. C
  10958.  10   KA = 0
  10959.       KALIM = 12
  10960.       K = P
  10961.       IF (IERR .NE. 0) K = IABS(IERR) - 1
  10962.       V(NREDUC) = HALF*DOTPRD(K, QTR, QTR)
  10963. C
  10964. C  ***  SET UP TO TRY INITIAL GAUSS-NEWTON STEP  ***
  10965. C
  10966.  20   V(DST0) = NEGONE
  10967.       IF (IERR .NE. 0) GO TO 90
  10968. C
  10969. C  ***  COMPUTE GAUSS-NEWTON STEP  ***
  10970. C
  10971. C     ***  NOTE -- THE R-MATRIX IS STORED COMPACTLY BY COLUMNS IN
  10972. C     ***  R(1), R(2), R(3), ...  IT IS THE TRANSPOSE OF A
  10973. C     ***  LOWER TRIANGULAR MATRIX STORED COMPACTLY BY ROWS, AND WE
  10974. C     ***  TREAT IT AS SUCH WHEN USING LITVMU AND LIVMUL.
  10975.       CALL LITVMU(P, W, R, QTR)
  10976. C     ***  TEMPORARILY STORE PERMUTED -D*STEP IN STEP.
  10977.       DO 60 I = 1, P
  10978.          J1 = IPIVOT(I)
  10979.          STEP(I) = D(J1)*W(I)
  10980.  60      CONTINUE
  10981.       DST = V2NORM(P, STEP)
  10982.       V(DST0) = DST
  10983.       PHI = DST - RAD
  10984.       IF (PHI .LE. PHIMAX) GO TO 410
  10985. C     ***  IF THIS IS A RESTART, GO TO 110  ***
  10986.       IF (KA .GT. 0) GO TO 110
  10987. C
  10988. C  ***  GAUSS-NEWTON STEP WAS UNACCEPTABLE.  COMPUTE L0  ***
  10989. C
  10990.       DO 70 I = 1, P
  10991.          J1 = IPIVOT(I)
  10992.          STEP(I) = D(J1)*(STEP(I)/DST)
  10993.  70      CONTINUE
  10994.       CALL LIVMUL(P, STEP, R, STEP)
  10995.       T = ONE / V2NORM(P, STEP)
  10996.       W(PHIPIN) = (T/DST)*T
  10997.       LK = PHI*W(PHIPIN)
  10998. C
  10999. C  ***  COMPUTE U0  ***
  11000. C
  11001.  90   DO 100 I = 1, P
  11002.  100     W(I) = G(I)/D(I)
  11003.       V(DGNORM) = V2NORM(P, W)
  11004.       UK = V(DGNORM)/RAD
  11005.       IF (UK .LE. ZERO) GO TO 390
  11006. C
  11007. C     ***  ALPHAK WILL BE USED AS THE CURRENT MARQUARDT PARAMETER.  WE
  11008. C     ***  USE MORE*S SCHEME FOR INITIALIZING IT.
  11009.       ALPHAK = DABS(V(STPPAR)) * V(RAD0)/RAD
  11010. C
  11011. C
  11012. C  ***  TOP OF LOOP -- INCREMENT KA, COPY R TO RMAT, QTR TO RES  ***
  11013. C
  11014.  110  KA = KA + 1
  11015.       CALL VCOPY(PP1O2, W(RMAT), R)
  11016.       CALL VCOPY(P, W(RES), QTR)
  11017. C
  11018. C  ***  SAFEGUARD ALPHAK AND INITIALIZE FAST GIVENS SCALE VECTOR.  ***
  11019. C
  11020.       IF (ALPHAK .LE. ZERO .OR. ALPHAK .LT. LK .OR. ALPHAK .GE. UK)
  11021.      1             ALPHAK = UK * DMAX1(P001, DSQRT(LK/UK))
  11022.       SQRTAK = DSQRT(ALPHAK)
  11023.       DO 120 I = 1, P
  11024.  120     W(I) = ONE
  11025. C
  11026. C  ***  ADD ALPHAK*D AND UPDATE QR DECOMP. USING FAST GIVENS TRANS.  ***
  11027. C
  11028.       DO 270 I = 1, P
  11029. C        ***  GENERATE, APPLY 1ST GIVENS TRANS. FOR ROW I OF ALPHAK*D.
  11030. C        ***  (USE STEP TO STORE TEMPORARY ROW)  ***
  11031.          L = I*(I+1)/2 + RMAT0
  11032.          WL = W(L)
  11033.          D2 = ONE
  11034.          D1 = W(I)
  11035.          J1 = IPIVOT(I)
  11036.          ADI = SQRTAK*D(J1)
  11037.          IF (ADI .GE. DABS(WL)) GO TO 150
  11038.  130     A = ADI/WL
  11039.          B = D2*A/D1
  11040.          T = A*B + ONE
  11041.          IF (T .GT. TTOL) GO TO 150
  11042.          W(I) = D1/T
  11043.          D2 = D2/T
  11044.          W(L) = T*WL
  11045.          A = -A
  11046.          DO 140 J1 = I, P
  11047.               L = L + J1
  11048.               STEP(J1) = A*W(L)
  11049.  140          CONTINUE
  11050.          GO TO 170
  11051. C
  11052.  150     B = WL/ADI
  11053.          A = D1*B/D2
  11054.          T = A*B + ONE
  11055.          IF (T .GT. TTOL) GO TO 130
  11056.          W(I) = D2/T
  11057.          D2 = D1/T
  11058.          W(L) = T*ADI
  11059.          DO 160 J1 = I, P
  11060.               L = L + J1
  11061.               WL = W(L)
  11062.               STEP(J1) = -WL
  11063.               W(L) = A*WL
  11064.  160          CONTINUE
  11065. C
  11066.  170     IF (I .EQ. P) GO TO 280
  11067. C
  11068. C        ***  NOW USE GIVENS TRANS. TO ZERO ELEMENTS OF TEMP. ROW  ***
  11069. C
  11070.          IP1 = I + 1
  11071.          DO 260 I1 = IP1, P
  11072.               L = I1*(I1+1)/2 + RMAT0
  11073.               WL = W(L)
  11074.               SI = STEP(I1-1)
  11075.               D1 = W(I1)
  11076. C
  11077. C             ***  RESCALE ROW I1 IF NECESSARY  ***
  11078. C
  11079.               IF (D1 .GE. DTOL) GO TO 190
  11080.                    D1 = D1*DFACSQ
  11081.                    WL = WL/DFAC
  11082.                    K = L
  11083.                    DO 180 J1 = I1, P
  11084.                         K = K + J1
  11085.                         W(K) = W(K)/DFAC
  11086.  180                    CONTINUE
  11087. C
  11088. C             ***  USE GIVENS TRANS. TO ZERO NEXT ELEMENT OF TEMP. ROW
  11089. C
  11090.  190          IF (DABS(SI) .GT. DABS(WL)) GO TO 220
  11091.               IF (SI .EQ. ZERO) GO TO 260
  11092.  200          A = SI/WL
  11093.               B = D2*A/D1
  11094.               T = A*B + ONE
  11095.               IF (T .GT. TTOL) GO TO 220
  11096.               W(L) = T*WL
  11097.               W(I1) = D1/T
  11098.               D2 = D2/T
  11099.               DO 210 J1 = I1, P
  11100.                    L = L + J1
  11101.                    WL = W(L)
  11102.                    SJ = STEP(J1)
  11103.                    W(L) = WL + B*SJ
  11104.                    STEP(J1) = SJ - A*WL
  11105.  210               CONTINUE
  11106.               GO TO 240
  11107. C
  11108.  220          B = WL/SI
  11109.               A = D1*B/D2
  11110.               T = A*B + ONE
  11111.               IF (T .GT. TTOL) GO TO 200
  11112.               W(I1) = D2/T
  11113.               D2 = D1/T
  11114.               W(L) = T*SI
  11115.               DO 230 J1 = I1, P
  11116.                    L = L + J1
  11117.                    WL = W(L)
  11118.                    SJ = STEP(J1)
  11119.                    W(L) = A*WL + SJ
  11120.                    STEP(J1) = B*SJ - WL
  11121.  230               CONTINUE
  11122. C
  11123. C             ***  RESCALE TEMP. ROW IF NECESSARY  ***
  11124. C
  11125.  240          IF (D2 .GE. DTOL) GO TO 260
  11126.                    D2 = D2*DFACSQ
  11127.                    DO 250 K = I1, P
  11128.  250                    STEP(K) = STEP(K)/DFAC
  11129.  260          CONTINUE
  11130.  270     CONTINUE
  11131. C
  11132. C  ***  COMPUTE STEP  ***
  11133. C
  11134.  280  CALL LITVMU(P, W(RES), W(RMAT), W(RES))
  11135. C     ***  RECOVER STEP AND STORE PERMUTED -D*STEP AT W(RES)  ***
  11136.       DO 290 I = 1, P
  11137.          J1 = IPIVOT(I)
  11138.          K = RES0 + I
  11139.          T = W(K)
  11140.          STEP(J1) = -T
  11141.          W(K) = T*D(J1)
  11142.  290     CONTINUE
  11143.       DST = V2NORM(P, W(RES))
  11144.       PHI = DST - RAD
  11145.       IF (PHI .LE. PHIMAX .AND. PHI .GE. PHIMIN) GO TO 430
  11146.       IF (OLDPHI .EQ. PHI) GO TO 430
  11147.       OLDPHI = PHI
  11148. C
  11149. C  ***  CHECK FOR (AND HANDLE) SPECIAL CASE  ***
  11150. C
  11151.       IF (PHI .GT. ZERO) GO TO 310
  11152.          IF (KA .GE. KALIM) GO TO 430
  11153.               TWOPSI = ALPHAK*DST*DST - DOTPRD(P, STEP, G)
  11154.               IF (ALPHAK .GE. TWOPSI*PSIFAC) GO TO 310
  11155.                    V(STPPAR) = -ALPHAK
  11156.                    GO TO 440
  11157. C
  11158. C  ***  UNACCEPTABLE STEP -- UPDATE LK, UK, ALPHAK, AND TRY AGAIN  ***
  11159. C
  11160.  300  IF (PHI .LT. ZERO) UK = DMIN1(UK, ALPHAK)
  11161.       GO TO 320
  11162.  310  IF (PHI .LT. ZERO) UK = ALPHAK
  11163.  320  DO 330 I = 1, P
  11164.          J1 = IPIVOT(I)
  11165.          K = RES0 + I
  11166.          STEP(I) = D(J1) * (W(K)/DST)
  11167.  330     CONTINUE
  11168.       CALL LIVMUL(P, STEP, W(RMAT), STEP)
  11169.       DO 340 I = 1, P
  11170.  340     STEP(I) = STEP(I) / DSQRT(W(I))
  11171.       T = ONE / V2NORM(P, STEP)
  11172.       ALPHAK = ALPHAK + T*PHI*T/RAD
  11173.       LK = DMAX1(LK, ALPHAK)
  11174.       GO TO 110
  11175. C
  11176. C  ***  RESTART  ***
  11177. C
  11178.  370  LK = W(LK0)
  11179.       UK = W(UK0)
  11180.       IF (V(DST0) .GT. ZERO .AND. V(DST0) - RAD .LE. PHIMAX) GO TO 20
  11181.       ALPHAK = DABS(V(STPPAR))
  11182.       DST = W(DSTSAV)
  11183.       PHI = DST - RAD
  11184.       T = V(DGNORM)/RAD
  11185.       IF (RAD .GT. V(RAD0)) GO TO 380
  11186. C
  11187. C        ***  SMALLER RADIUS  ***
  11188.          UK = T
  11189.          IF (ALPHAK .LE. ZERO) LK = ZERO
  11190.          IF (V(DST0) .GT. ZERO) LK = DMAX1(LK, (V(DST0)-RAD)*W(PHIPIN))
  11191.          GO TO 300
  11192. C
  11193. C     ***  BIGGER RADIUS  ***
  11194.  380  IF (ALPHAK .LE. ZERO .OR. UK .GT. T) UK = T
  11195.       LK = ZERO
  11196.       IF (V(DST0) .GT. ZERO) LK = DMAX1(LK, (V(DST0)-RAD)*W(PHIPIN))
  11197.       GO TO 300
  11198. C
  11199. C  ***  SPECIAL CASE -- RAD .LE. 0 OR (G = 0 AND J IS SINGULAR)  ***
  11200. C
  11201.  390  V(STPPAR) = ZERO
  11202.       DST = ZERO
  11203.       LK = ZERO
  11204.       UK = ZERO
  11205.       V(GTSTEP) = ZERO
  11206.       V(PREDUC) = ZERO
  11207.       DO 400 I = 1, P
  11208.  400     STEP(I) = ZERO
  11209.       GO TO 450
  11210. C
  11211. C  ***  ACCEPTABLE GAUSS-NEWTON STEP -- RECOVER STEP FROM W  ***
  11212. C
  11213.  410  ALPHAK = ZERO
  11214.       DO 420 I = 1, P
  11215.          J1 = IPIVOT(I)
  11216.          STEP(J1) = -W(I)
  11217.  420     CONTINUE
  11218. C
  11219. C  ***  SAVE VALUES FOR USE IN A POSSIBLE RESTART  ***
  11220. C
  11221.  430  V(STPPAR) = ALPHAK
  11222.  440  V(GTSTEP) = DOTPRD(P, STEP, G)
  11223.       V(PREDUC) = HALF * (ALPHAK*DST*DST - V(GTSTEP))
  11224.  450  V(DSTNRM) = DST
  11225.       W(DSTSAV) = DST
  11226.       W(LK0) = LK
  11227.       W(UK0) = UK
  11228.       V(RAD0) = RAD
  11229. C
  11230.  999  RETURN
  11231. C
  11232. C  ***  LAST CARD OF LMSTEP FOLLOWS  ***
  11233.       END
  11234.       SUBROUTINE LSQRT(N1, N, L, A, IRC)                                LSQ00010
  11235. C
  11236. C  ***  COMPUTE ROWS N1 THROUGH N OF THE CHOLESKY FACTOR  L  OF
  11237. C  ***  A = L*(L**T),  WHERE  L  AND THE LOWER TRIANGLE OF  A  ARE BOTH
  11238. C  ***  STORED COMPACTLY BY ROWS (AND MAY OCCUPY THE SAME STORAGE).
  11239. C  ***  IRC = 0 MEANS ALL WENT WELL.  IRC = J MEANS THE LEADING
  11240. C  ***  PRINCIPAL  J X J  SUBMATRIX OF  A  IS NOT POSITIVE DEFINITE --
  11241. C  ***  AND  L(J*(J+1)/2)  CONTAINS THE (NONPOS.) REDUCED J-TH DIAGONAL.
  11242. C
  11243. C  ***  PARAMETERS  ***
  11244. C
  11245.       INTEGER N1, N, IRC
  11246.       DOUBLE PRECISION L(1), A(1)
  11247. C     DIMENSION L(N*(N+1)/2), A(N*(N+1)/2)
  11248. C
  11249. C  ***  LOCAL VARIABLES  ***
  11250. C
  11251.       INTEGER I, IJ, IK, IM1, I0, J, JK, JM1, J0, K
  11252.       DOUBLE PRECISION T, TD, ZERO
  11253. C
  11254. C  ***  INTRINSIC FUNCTIONS  ***
  11255. C/+
  11256.       DOUBLE PRECISION DSQRT
  11257. C/
  11258. C/6
  11259.       DATA ZERO/0.D+0/
  11260. C/7
  11261. C     PARAMETER (ZERO=0.D+0)
  11262. C/
  11263. C
  11264. C  ***  BODY  ***
  11265. C
  11266.       I0 = N1 * (N1 - 1) / 2
  11267.       DO 50 I = N1, N
  11268.          TD = ZERO
  11269.          IF (I .EQ. 1) GO TO 40
  11270.          J0 = 0
  11271.          IM1 = I - 1
  11272.          DO 30 J = 1, IM1
  11273.               T = ZERO
  11274.               IF (J .EQ. 1) GO TO 20
  11275.               JM1 = J - 1
  11276.               DO 10 K = 1, JM1
  11277.                    IK = I0 + K
  11278.                    JK = J0 + K
  11279.                    T = T + L(IK)*L(JK)
  11280.  10                CONTINUE
  11281.  20           IJ = I0 + J
  11282.               J0 = J0 + J
  11283.               T = (A(IJ) - T) / L(J0)
  11284.               L(IJ) = T
  11285.               TD = TD + T*T
  11286.  30           CONTINUE
  11287.  40      I0 = I0 + I
  11288.          T = A(I0) - TD
  11289.          IF (T .LE. ZERO) GO TO 60
  11290.          L(I0) = DSQRT(T)
  11291.  50      CONTINUE
  11292. C
  11293.       IRC = 0
  11294.       GO TO 999
  11295. C
  11296.  60   L(I0) = T
  11297.       IRC = I
  11298. C
  11299.  999  RETURN
  11300. C
  11301. C  ***  LAST CARD OF LSQRT  ***
  11302.       END
  11303.       DOUBLE PRECISION FUNCTION LSVMIN(P, L, X, Y)                      LSV00010
  11304. C
  11305. C  ***  ESTIMATE SMALLEST SING. VALUE OF PACKED LOWER TRIANG. MATRIX L
  11306. C
  11307. C  ***  PARAMETER DECLARATIONS  ***
  11308. C
  11309.       INTEGER P
  11310.       DOUBLE PRECISION L(1), X(P), Y(P)
  11311. C     DIMENSION L(P*(P+1)/2)
  11312. C
  11313. C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  11314. C
  11315. C  ***  PURPOSE  ***
  11316. C
  11317. C     THIS FUNCTION RETURNS A GOOD OVER-ESTIMATE OF THE SMALLEST
  11318. C     SINGULAR VALUE OF THE PACKED LOWER TRIANGULAR MATRIX L.
  11319. C
  11320. C  ***  PARAMETER DESCRIPTION  ***
  11321. C
  11322. C  P (IN)  = THE ORDER OF L.  L IS A  P X P  LOWER TRIANGULAR MATRIX.
  11323. C  L (IN)  = ARRAY HOLDING THE ELEMENTS OF  L  IN ROW ORDER, I.E.
  11324. C             L(1,1), L(2,1), L(2,2), L(3,1), L(3,2), L(3,3), ETC.
  11325. C  X (OUT) IF LSVMIN RETURNS A POSITIVE VALUE, THEN X IS A NORMALIZED
  11326. C             APPROXIMATE LEFT SINGULAR VECTOR CORRESPONDING TO THE
  11327. C             SMALLEST SINGULAR VALUE.  THIS APPROXIMATION MAY BE VERY
  11328. C             CRUDE.  IF LSVMIN RETURNS ZERO, THEN SOME COMPONENTS OF X
  11329. C             ARE ZERO AND THE REST RETAIN THEIR INPUT VALUES.
  11330. C  Y (OUT) IF LSVMIN RETURNS A POSITIVE VALUE, THEN Y = (L**-1)*X IS AN
  11331. C             UNNORMALIZED APPROXIMATE RIGHT SINGULAR VECTOR CORRESPOND-
  11332. C             ING TO THE SMALLEST SINGULAR VALUE.  THIS APPROXIMATION
  11333. C             MAY BE CRUDE.  IF LSVMIN RETURNS ZERO, THEN Y RETAINS ITS
  11334. C             INPUT VALUE.  THE CALLER MAY PASS THE SAME VECTOR FOR X
  11335. C             AND Y (NONSTANDARD FORTRAN USAGE), IN WHICH CASE Y OVER-
  11336. C             WRITES X (FOR NONZERO LSVMIN RETURNS).
  11337. C
  11338. C  ***  APPLICATION AND USAGE RESTRICTIONS  ***
  11339. C
  11340. C     THERE ARE NO USAGE RESTRICTIONS.
  11341. C
  11342. C  ***  ALGORITHM NOTES  ***
  11343. C
  11344. C     THE ALGORITHM IS BASED ON (1), WITH THE ADDITIONAL PROVISION THAT
  11345. C     LSVMIN = 0 IS RETURNED IF THE SMALLEST DIAGONAL ELEMENT OF L
  11346. C     (IN MAGNITUDE) IS NOT MORE THAN THE UNIT ROUNDOFF TIMES THE
  11347. C     LARGEST.  THE ALGORITHM USES A RANDOM NUMBER GENERATOR PROPOSED
  11348. C     IN (4), WHICH PASSES THE SPECTRAL TEST WITH FLYING COLORS -- SEE
  11349. C     (2) AND (3).
  11350. C
  11351. C  ***  SUBROUTINES AND FUNCTIONS CALLED  ***
  11352. C
  11353. C        V2NORM - FUNCTION, RETURNS THE 2-NORM OF A VECTOR.
  11354. C
  11355. C  ***  REFERENCES  ***
  11356. C
  11357. C     (1) CLINE, A., MOLER, C., STEWART, G., AND WILKINSON, J.H.(1977),
  11358. C         AN ESTIMATE FOR THE CONDITION NUMBER OF A MATRIX, REPORT
  11359. C         TM-310, APPLIED MATH. DIV., ARGONNE NATIONAL LABORATORY.
  11360. C
  11361. C     (2) HOAGLIN, D.C. (1976), THEORETICAL PROPERTIES OF CONGRUENTIAL
  11362. C         RANDOM-NUMBER GENERATORS --  AN EMPIRICAL VIEW,
  11363. C         MEMORANDUM NS-340, DEPT. OF STATISTICS, HARVARD UNIV.
  11364. C
  11365. C     (3) KNUTH, D.E. (1969), THE ART OF COMPUTER PROGRAMMING, VOL. 2
  11366. C         (SEMINUMERICAL ALGORITHMS), ADDISON-WESLEY, READING, MASS.
  11367. C
  11368. C     (4) SMITH, C.S. (1971), MULTIPLICATIVE PSEUDO-RANDOM NUMBER
  11369. C         GENERATORS WITH PRIME MODULUS, J. ASSOC. COMPUT. MACH. 18,
  11370. C         PP. 586-593.
  11371. C
  11372. C  ***  HISTORY  ***
  11373. C
  11374. C     DESIGNED AND CODED BY DAVID M. GAY (WINTER 1977/SUMMER 1978).
  11375. C
  11376. C  ***  GENERAL  ***
  11377. C
  11378. C     THIS SUBROUTINE WAS WRITTEN IN CONNECTION WITH RESEARCH
  11379. C     SUPPORTED BY THE NATIONAL SCIENCE FOUNDATION UNDER GRANTS
  11380. C     MCS-7600324, DCR75-10143, 76-14311DSS, AND MCS76-11989.
  11381. C
  11382. C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  11383. C
  11384. C  ***  LOCAL VARIABLES  ***
  11385. C
  11386.       INTEGER I, II, IX, J, JI, JJ, JJJ, JM1, J0, PPLUS1
  11387.       DOUBLE PRECISION B, PSJ, SMINUS, SPLUS, T, XMINUS, XPLUS
  11388. C
  11389. C  ***  CONSTANTS  ***
  11390. C
  11391.       DOUBLE PRECISION HALF, ONE, R9973, ZERO
  11392. C
  11393. C  ***  INTRINSIC FUNCTIONS  ***
  11394. C/+
  11395.       INTEGER MOD
  11396.       REAL FLOAT
  11397.       DOUBLE PRECISION DABS
  11398. C/
  11399. C  ***  EXTERNAL FUNCTIONS AND SUBROUTINES  ***
  11400. C
  11401.       EXTERNAL V2NORM
  11402.       DOUBLE PRECISION V2NORM
  11403. C
  11404. C/6
  11405.       DATA HALF/0.5D+0/, ONE/1.D+0/, R9973/9973.D+0/, ZERO/0.D+0/
  11406. C/7
  11407. C     PARAMETER (HALF=0.5D+0, ONE=1.D+0, R9973=9973.D+0, ZERO=0.D+0)
  11408. C     SAVE IX
  11409. C/
  11410.       DATA IX/2/
  11411. C
  11412. C  ***  BODY  ***
  11413. C
  11414. C  ***  FIRST CHECK WHETHER TO RETURN LSVMIN = 0 AND INITIALIZE X  ***
  11415. C
  11416.       II = 0
  11417.       DO 10 I = 1, P
  11418.          X(I) = ZERO
  11419.          II = II + I
  11420.          IF (L(II) .EQ. ZERO) GO TO 300
  11421.  10      CONTINUE
  11422.       IF (MOD(IX, 9973) .EQ. 0) IX = 2
  11423.       PPLUS1 = P + 1
  11424. C
  11425. C  ***  SOLVE (L**T)*X = B, WHERE THE COMPONENTS OF B HAVE RANDOMLY
  11426. C  ***  CHOSEN MAGNITUDES IN (.5,1) WITH SIGNS CHOSEN TO MAKE X LARGE.
  11427. C
  11428. C     DO J = P TO 1 BY -1...
  11429.       DO 100 JJJ = 1, P
  11430.          J = PPLUS1 - JJJ
  11431. C       ***  DETERMINE X(J) IN THIS ITERATION. NOTE FOR I = 1,2,...,J
  11432. C       ***  THAT X(I) HOLDS THE CURRENT PARTIAL SUM FOR ROW I.
  11433.          IX = MOD(3432*IX, 9973)
  11434.          B = HALF*(ONE + FLOAT(IX)/R9973)
  11435.          XPLUS = (B - X(J))
  11436.          XMINUS = (-B - X(J))
  11437.          SPLUS = DABS(XPLUS)
  11438.          SMINUS = DABS(XMINUS)
  11439.          JM1 = J - 1
  11440.          J0 = J*JM1/2
  11441.          JJ = J0 + J
  11442.          XPLUS = XPLUS/L(JJ)
  11443.          XMINUS = XMINUS/L(JJ)
  11444.          IF (JM1 .EQ. 0) GO TO 30
  11445.          DO 20 I = 1, JM1
  11446.               JI = J0 + I
  11447.               SPLUS = SPLUS + DABS(X(I) + L(JI)*XPLUS)
  11448.               SMINUS = SMINUS + DABS(X(I) + L(JI)*XMINUS)
  11449.  20           CONTINUE
  11450.  30      IF (SMINUS .GT. SPLUS) XPLUS = XMINUS
  11451.          X(J) = XPLUS
  11452. C       ***  UPDATE PARTIAL SUMS  ***
  11453.          IF (JM1 .EQ. 0) GO TO 100
  11454.          DO 40 I = 1, JM1
  11455.               JI = J0 + I
  11456.               X(I) = X(I) + L(JI)*XPLUS
  11457.  40           CONTINUE
  11458.  100     CONTINUE
  11459. C
  11460. C  ***  NORMALIZE X  ***
  11461. C
  11462.       T = ONE/V2NORM(P, X)
  11463.       DO 110 I = 1, P
  11464.  110     X(I) = T*X(I)
  11465. C
  11466. C  ***  SOLVE L*Y = X AND RETURN SVMIN = 1/TWONORM(Y)  ***
  11467. C
  11468.       DO 200 J = 1, P
  11469.          PSJ = ZERO
  11470.          JM1 = J - 1
  11471.          J0 = J*JM1/2
  11472.          IF (JM1 .EQ. 0) GO TO 130
  11473.          DO 120 I = 1, JM1
  11474.               JI = J0 + I
  11475.               PSJ = PSJ + L(JI)*Y(I)
  11476.  120          CONTINUE
  11477.  130     JJ = J0 + J
  11478.          Y(J) = (X(J) - PSJ)/L(JJ)
  11479.  200     CONTINUE
  11480. C
  11481.       LSVMIN = ONE/V2NORM(P, Y)
  11482.       GO TO 999
  11483. C
  11484.  300  LSVMIN = ZERO
  11485.  999  RETURN
  11486. C  ***  LAST CARD OF LSVMIN FOLLOWS  ***
  11487.       END
  11488.       SUBROUTINE LTSQAR(N, A, L)                                        LTS00010
  11489. C
  11490. C  ***  SET A TO LOWER TRIANGLE OF (L**T) * L  ***
  11491. C
  11492. C  ***  L = N X N LOWER TRIANG. MATRIX STORED ROWWISE.  ***
  11493. C  ***  A IS ALSO STORED ROWWISE AND MAY SHARE STORAGE WITH L.  ***
  11494. C
  11495.       INTEGER N
  11496.       DOUBLE PRECISION A(1), L(1)
  11497. C     DIMENSION A(N*(N+1)/2), L(N*(N+1)/2)
  11498. C
  11499.       INTEGER I, II, IIM1, I1, J, K, M
  11500.       DOUBLE PRECISION LII, LJ
  11501. C
  11502.       II = 0
  11503.       DO 50 I = 1, N
  11504.          I1 = II + 1
  11505.          II = II + I
  11506.          M = 1
  11507.          IF (I .EQ. 1) GO TO 30
  11508.          IIM1 = II - 1
  11509.          DO 20 J = I1, IIM1
  11510.               LJ = L(J)
  11511.               DO 10 K = I1, J
  11512.                    A(M) = A(M) + LJ*L(K)
  11513.                    M = M + 1
  11514.  10                CONTINUE
  11515.  20           CONTINUE
  11516.  30      LII = L(II)
  11517.          DO 40 J = I1, II
  11518.  40           A(J) = LII * L(J)
  11519.  50      CONTINUE
  11520. C
  11521.  999  RETURN
  11522. C  ***  LAST CARD OF LTSQAR FOLLOWS  ***
  11523.       END
  11524.       SUBROUTINE PARCHK(IV, N, NN, P, V)                                PAR00010
  11525. C
  11526. C  ***  CHECK NL2SOL (VERSION 2.2) PARAMETERS, PRINT CHANGED VALUES  ***
  11527. C
  11528.       INTEGER IV(1), N, NN, P
  11529.       DOUBLE PRECISION V(1)
  11530. C     DIMENSION IV(*), V(*)
  11531. C
  11532.       EXTERNAL DFAULT, RMDCON, VCOPY
  11533.       DOUBLE PRECISION RMDCON
  11534. C DFAULT -- SUPPLIES DFAULT PARAMETER VALUES.
  11535. C RMDCON -- RETURNS MACHINE-DEPENDENT CONSTANTS.
  11536. C VCOPY  -- COPIES ONE VECTOR TO ANOTHER.
  11537. C
  11538. C  ***  LOCAL VARIABLES  ***
  11539. C
  11540.       INTEGER I, IV1, JTOLP, K, L, M, NVDFLT, PU
  11541. C/6
  11542.       REAL CNGD(3), DFLT(3), VN(2,27), WHICH(3)
  11543. C/7
  11544. C     CHARACTER*4 CNGD(3), DFLT(3), VN(2,27), WHICH(3)
  11545. C/
  11546.       DOUBLE PRECISION BIG, MACHEP, TINY, VK, VM(27), VX(27), ZERO
  11547. C
  11548. C  ***  IV AND V SUBSCRIPTS  ***
  11549. C
  11550.       INTEGER DTYPE, DTYPE0, D0INIT, EPSLON, INITS, JTINIT, JTOL0,
  11551.      1        JTOL1, OLDN, OLDNN, OLDP, PARPRT, PARSV1, PRUNIT
  11552. C
  11553. C/6
  11554.       DATA NVDFLT/27/, ZERO/0.D+0/
  11555. C/7
  11556. C     PARAMETER (NVDFLT=27, ZERO=0.D+0)
  11557. C/
  11558. C
  11559. C/6
  11560.       DATA DTYPE/16/, DTYPE0/29/, D0INIT/37/, EPSLON/19/,
  11561.      1     INITS/25/, JTINIT/39/, JTOL0/86/, JTOL1/87/,
  11562.      2     OLDN/45/, OLDNN/46/, OLDP/47/, PARPRT/20/,
  11563.      3     PARSV1/51/, PRUNIT/21/
  11564. C/7
  11565. C     PARAMETER (DTYPE=16, DTYPE0=29, D0INIT=37, EPSLON=19,
  11566. C    1     INITS=25, JTINIT=39, JTOL0=86, JTOL1=87,
  11567. C    2     OLDN=45, OLDNN=46, OLDP=47, PARPRT=20,
  11568. C    3     PARSV1=51, PRUNIT=21)
  11569. C     SAVE BIG, TINY
  11570. C/
  11571. C
  11572.       DATA BIG/0.D+0/, TINY/1.D+0/
  11573. C/6
  11574.       DATA VN(1,1),VN(2,1)/4HEPSL,4HON../
  11575.       DATA VN(1,2),VN(2,2)/4HPHMN,4HFC../
  11576.       DATA VN(1,3),VN(2,3)/4HPHMX,4HFC../
  11577.       DATA VN(1,4),VN(2,4)/4HDECF,4HAC../
  11578.       DATA VN(1,5),VN(2,5)/4HINCF,4HAC../
  11579.       DATA VN(1,6),VN(2,6)/4HRDFC,4HMN../
  11580.       DATA VN(1,7),VN(2,7)/4HRDFC,4HMX../
  11581.       DATA VN(1,8),VN(2,8)/4HTUNE,4HR1../
  11582.       DATA VN(1,9),VN(2,9)/4HTUNE,4HR2../
  11583.       DATA VN(1,10),VN(2,10)/4HTUNE,4HR3../
  11584.       DATA VN(1,11),VN(2,11)/4HTUNE,4HR4../
  11585.       DATA VN(1,12),VN(2,12)/4HTUNE,4HR5../
  11586.       DATA VN(1,13),VN(2,13)/4HAFCT,4HOL../
  11587.       DATA VN(1,14),VN(2,14)/4HRFCT,4HOL../
  11588.       DATA VN(1,15),VN(2,15)/4HXCTO,4HL.../
  11589.       DATA VN(1,16),VN(2,16)/4HXFTO,4HL.../
  11590.       DATA VN(1,17),VN(2,17)/4HLMAX,4H0.../
  11591.       DATA VN(1,18),VN(2,18)/4HDLTF,4HDJ../
  11592.       DATA VN(1,19),VN(2,19)/4HD0IN,4HIT../
  11593.       DATA VN(1,20),VN(2,20)/4HDINI,4HT.../
  11594.       DATA VN(1,21),VN(2,21)/4HJTIN,4HIT../
  11595.       DATA VN(1,22),VN(2,22)/4HDLTF,4HDC../
  11596.       DATA VN(1,23),VN(2,23)/4HDFAC,4H..../
  11597.       DATA VN(1,24),VN(2,24)/4HRLIM,4HIT../
  11598.       DATA VN(1,25),VN(2,25)/4HCOSM,4HIN../
  11599.       DATA VN(1,26),VN(2,26)/4HDELT,4HA0../
  11600.       DATA VN(1,27),VN(2,27)/4HFUZZ,4H..../
  11601. C/7
  11602. C     DATA VN(1,1),VN(2,1)/'EPSL','ON..'/
  11603. C     DATA VN(1,2),VN(2,2)/'PHMN','FC..'/
  11604. C     DATA VN(1,3),VN(2,3)/'PHMX','FC..'/
  11605. C     DATA VN(1,4),VN(2,4)/'DECF','AC..'/
  11606. C     DATA VN(1,5),VN(2,5)/'INCF','AC..'/
  11607. C     DATA VN(1,6),VN(2,6)/'RDFC','MN..'/
  11608. C     DATA VN(1,7),VN(2,7)/'RDFC','MX..'/
  11609. C     DATA VN(1,8),VN(2,8)/'TUNE','R1..'/
  11610. C     DATA VN(1,9),VN(2,9)/'TUNE','R2..'/
  11611. C     DATA VN(1,10),VN(2,10)/'TUNE','R3..'/
  11612. C     DATA VN(1,11),VN(2,11)/'TUNE','R4..'/
  11613. C     DATA VN(1,12),VN(2,12)/'TUNE','R5..'/
  11614. C     DATA VN(1,13),VN(2,13)/'AFCT','OL..'/
  11615. C     DATA VN(1,14),VN(2,14)/'RFCT','OL..'/
  11616. C     DATA VN(1,15),VN(2,15)/'XCTO','L...'/
  11617. C     DATA VN(1,16),VN(2,16)/'XFTO','L...'/
  11618. C     DATA VN(1,17),VN(2,17)/'LMAX','0...'/
  11619. C     DATA VN(1,18),VN(2,18)/'DLTF','DJ..'/
  11620. C     DATA VN(1,19),VN(2,19)/'D0IN','IT..'/
  11621. C     DATA VN(1,20),VN(2,20)/'DINI','T...'/
  11622. C     DATA VN(1,21),VN(2,21)/'JTIN','IT..'/
  11623. C     DATA VN(1,22),VN(2,22)/'DLTF','DC..'/
  11624. C     DATA VN(1,23),VN(2,23)/'DFAC','....'/
  11625. C     DATA VN(1,24),VN(2,24)/'RLIM','IT..'/
  11626. C     DATA VN(1,25),VN(2,25)/'COSM','IN..'/
  11627. C     DATA VN(1,26),VN(2,26)/'DELT','A0..'/
  11628. C     DATA VN(1,27),VN(2,27)/'FUZZ','....'/
  11629. C/
  11630. C
  11631.       DATA VM(1)/1.0D-3/, VM(2)/-0.99D+0/, VM(3)/1.0D-3/, VM(4)/1.0D-2/,
  11632.      1     VM(5)/1.2D+0/, VM(6)/1.D-2/, VM(7)/1.2D+0/, VM(8)/0.D+0/,
  11633.      2     VM(9)/0.D+0/, VM(10)/1.D-3/, VM(11)/-1.D+0/, VM(15)/0.D+0/,
  11634.      3     VM(16)/0.D+0/, VM(19)/0.D+0/, VM(20)/-10.D+0/, VM(21)/0.D+0/,
  11635.      4     VM(23)/0.D+0/, VM(24)/1.D+10/, VM(27)/1.01D+0/
  11636.       DATA VX(1)/0.9D+0/, VX(2)/-1.D-3/, VX(3)/1.D+1/, VX(4)/0.8D+0/,
  11637.      1     VX(5)/1.D+2/, VX(6)/0.8D+0/, VX(7)/1.D+2/, VX(8)/0.5D+0/,
  11638.      2     VX(9)/0.5D+0/, VX(10)/1.D+0/, VX(11)/1.D+0/, VX(14)/0.1D+0/,
  11639.      3     VX(15)/1.D+0/, VX(16)/1.D+0/, VX(18)/1.D+0/, VX(22)/1.D+0/,
  11640.      4     VX(23)/1.D+0/, VX(25)/1.D+0/, VX(26)/1.D+0/, VX(27)/1.D+2/
  11641. C
  11642. C/6
  11643.       DATA CNGD(1),CNGD(2),CNGD(3)/4H---C,4HHANG,4HED V/,
  11644.      1     DFLT(1),DFLT(2),DFLT(3)/4HNOND,4HEFAU,4HLT V/
  11645. C/7
  11646. C     DATA CNGD(1),CNGD(2),CNGD(3)/'---C','HANG','ED V'/,
  11647. C    1     DFLT(1),DFLT(2),DFLT(3)/'NOND','EFAU','LT V'/
  11648. C/
  11649. C
  11650. C.......................................................................
  11651. C
  11652.       IF (IV(1) .EQ. 0) CALL DFAULT(IV, V)
  11653.       PU = IV(PRUNIT)
  11654.       IV1 = IV(1)
  11655.       IF (IV1 .NE. 12) GO TO 30
  11656.          IF (NN .GE. N .AND. N .GE. P .AND. P .GE. 1) GO TO 20
  11657.               IV(1) = 16
  11658.               IF (PU .NE. 0) WRITE(PU,10) NN, N, P
  11659.  10           FORMAT(30H0///// BAD NN, N, OR P... NN =,I5,5H, N =,I5,
  11660.      1               5H, P =,I5)
  11661.               GO TO 999
  11662.  20      K = IV(21)
  11663.          CALL DFAULT(IV(21), V(33))
  11664.          IV(21) = K
  11665.          IV(DTYPE0) = IV(DTYPE+20)
  11666.          IV(OLDN) = N
  11667.          IV(OLDNN) = NN
  11668.          IV(OLDP) = P
  11669.          WHICH(1) = DFLT(1)
  11670.          WHICH(2) = DFLT(2)
  11671.          WHICH(3) = DFLT(3)
  11672.          GO TO 80
  11673.  30   IF (N .EQ. IV(OLDN) .AND. NN .EQ. IV(OLDNN) .AND. P .EQ. IV(OLDP))
  11674.      1                       GO TO 50
  11675.          IV(1) = 17
  11676.          IF (PU .NE. 0) WRITE(PU,40) IV(OLDNN), IV(OLDN), IV(OLDP), NN,
  11677.      1                               N, P
  11678.  40      FORMAT(30H0///// (NN,N,P) CHANGED FROM (,I5,1H,,I5,1H,,I3,
  11679.      1          6H) TO (,I5,1H,,I5,1H,,I3,2H).)
  11680.          GO TO 999
  11681. C
  11682.  50   IF (IV1 .LE. 11 .AND. IV1 .GE. 1) GO TO 70
  11683.          IV(1) = 50
  11684.          IF (PU .NE. 0) WRITE(PU,60) IV1
  11685.  60      FORMAT(15H0/////  IV(1) =,I5,28H SHOULD BE BETWEEN 0 AND 12.)
  11686.          GO TO 999
  11687. C
  11688.  70   WHICH(1) = CNGD(1)
  11689.       WHICH(2) = CNGD(2)
  11690.       WHICH(3) = CNGD(3)
  11691. C
  11692.  80   IF (BIG .GT. TINY) GO TO 90
  11693.          TINY = RMDCON(1)
  11694.          MACHEP = RMDCON(3)
  11695.          BIG = RMDCON(6)
  11696.          VM(12) = MACHEP
  11697.          VX(12) = BIG
  11698.          VM(13) = TINY
  11699.          VX(13) = BIG
  11700.          VM(14) = MACHEP
  11701.          VM(17) = TINY
  11702.          VX(17) = BIG
  11703.          VM(18) = MACHEP
  11704.          VX(19) = BIG
  11705.          VX(20) = BIG
  11706.          VX(21) = BIG
  11707.          VM(22) = MACHEP
  11708.          VX(24) = RMDCON(5)
  11709.          VM(25) = MACHEP
  11710.          VM(26) = MACHEP
  11711.  90   M = 0
  11712.       IF (IV(INITS) .GE. 0 .AND. IV(INITS) .LE. 2) GO TO 110
  11713.          M = 18
  11714.          IF (PU .NE. 0) WRITE(PU,100) IV(INITS)
  11715.  100     FORMAT(25H0/////  INITS... IV(25) =,I4,20H SHOULD BE BETWEEN 0,
  11716.      1          7H AND 2.)
  11717.  110  K = EPSLON
  11718.       DO 140 I = 1, NVDFLT
  11719.          VK = V(K)
  11720.          IF (VK .GE. VM(I) .AND. VK .LE. VX(I)) GO TO 130
  11721.               M = K
  11722.               IF (PU .NE. 0) WRITE(PU,120) VN(1,I), VN(2,I), K, VK,
  11723.      1                                    VM(I), VX(I)
  11724.  120          FORMAT(8H0/////  ,2A4,5H.. V(,I2,3H) =,D11.3,7H SHOULD,
  11725.      1               11H BE BETWEEN,D11.3,4H AND,D11.3)
  11726.  130     K = K + 1
  11727.  140     CONTINUE
  11728. C
  11729.       IF (IV1 .EQ. 12 .AND. V(JTINIT) .GT. ZERO) GO TO 170
  11730. C
  11731. C  ***  CHECK JTOL VALUES  ***
  11732. C
  11733.       JTOLP = JTOL0 + P
  11734.       DO 160 I = JTOL1, JTOLP
  11735.          IF (V(I) .GT. ZERO) GO TO 160
  11736.          K = I - JTOL0
  11737.          IF (PU .NE. 0) WRITE(PU,150) K, I, V(I)
  11738.  150     FORMAT(12H0///// JTOL(,I3,6H) = V(,I3,3H) =,D11.3,
  11739.      1          20H SHOULD BE POSITIVE.)
  11740.          M = I
  11741.  160     CONTINUE
  11742. C
  11743.  170  IF (M .EQ. 0) GO TO 180
  11744.          IV(1) = M
  11745.          GO TO 999
  11746. C
  11747.  180  IF (PU .EQ. 0 .OR. IV(PARPRT) .EQ. 0) GO TO 999
  11748.       IF (IV1 .NE. 12 .OR. IV(INITS) .EQ. 0) GO TO 200
  11749.          M = 1
  11750.          WRITE(PU,190) IV(INITS)
  11751.  190     FORMAT(22H0NONDEFAULT VALUES..../20H INITS..... IV(25) =,I3)
  11752.  200  IF (IV(DTYPE) .EQ. IV(DTYPE0)) GO TO  210
  11753.          IF (M .EQ. 0) WRITE(PU,215) WHICH
  11754.          M = 1
  11755.          WRITE(PU,205) IV(DTYPE)
  11756.  205     FORMAT(20H DTYPE..... IV(16) =,I3)
  11757.  210  K = EPSLON
  11758.       L = PARSV1
  11759.       DO 240 I = 1, NVDFLT
  11760.          IF (V(K) .EQ. V(L)) GO TO 230
  11761.               IF (M .EQ. 0) WRITE(PU,215) WHICH
  11762.  215          FORMAT(1H0,3A4,9HALUES..../)
  11763.               M = 1
  11764.               WRITE(PU,220) VN(1,I), VN(2,I), K, V(K)
  11765.  220          FORMAT(1X,2A4,5H.. V(,I2,3H) =,D15.7)
  11766.  230     K = K + 1
  11767.          L = L + 1
  11768.  240     CONTINUE
  11769.       IV(DTYPE0) = IV(DTYPE)
  11770.       CALL VCOPY(NVDFLT, V(PARSV1), V(EPSLON))
  11771.       IF (IV1 .NE. 12) GO TO 999
  11772.          IF (V(JTINIT) .GT. ZERO) GO TO 260
  11773.               JTOLP = JTOL0 + P
  11774.               WRITE(PU,250) (V(I), I = JTOL1, JTOLP)
  11775.  250          FORMAT(24H0(INITIAL) JTOL ARRAY.../(1X,6D12.3))
  11776.  260     IF (V(D0INIT) .GT. ZERO) GO TO 999
  11777.               K = JTOL1 + P
  11778.               L = K + P - 1
  11779.               WRITE(PU,270) (V(I), I = K, L)
  11780.  270          FORMAT(22H0(INITIAL) D0 ARRAY.../1X,6D12.3)
  11781. C
  11782.  999  RETURN
  11783. C  ***  LAST CARD OF PARCHK FOLLOWS  ***
  11784.       END
  11785.       SUBROUTINE QAPPLY(NN, N, P, J, R, IERR)                           QAP00010
  11786. C     *****PARAMETERS.
  11787.       INTEGER NN, N, P, IERR
  11788.       DOUBLE PRECISION J(NN,P), R(N)
  11789. C
  11790. C     ..................................................................
  11791. C     ..................................................................
  11792. C
  11793. C     *****PURPOSE.
  11794. C     THIS SUBROUTINE APPLIES TO R THE ORTHOGONAL TRANSFORMATIONS
  11795. C     STORED IN J BY QRFACT
  11796. C
  11797. C     *****PARAMETER DESCRIPTION.
  11798. C     ON INPUT.
  11799. C
  11800. C        NN IS THE ROW DIMENSION OF THE MATRIX J AS DECLARED IN
  11801. C             THE CALLING PROGRAM DIMENSION STATEMENT
  11802. C
  11803. C        N IS THE NUMBER OF ROWS OF J AND THE SIZE OF THE VECTOR R
  11804. C
  11805. C        P IS THE NUMBER OF COLUMNS OF J AND THE SIZE OF SIGMA
  11806. C
  11807. C        J CONTAINS ON AND BELOW ITS DIAGONAL THE COLUMN VECTORS
  11808. C             U WHICH DETERMINE THE HOUSEHOLDER TRANSFORMATIONS
  11809. C             IDENT - U*U.TRANSPOSE
  11810. C
  11811. C        R IS THE RIGHT HAND SIDE VECTOR TO WHICH THE ORTHOGONAL
  11812. C             TRANSFORMATIONS WILL BE APPLIED
  11813. C
  11814. C        IERR IF NON-ZERO INDICATES THAT NOT ALL THE TRANSFORMATIONS
  11815. C             WERE SUCCESSFULLY DETERMINED AND ONLY THE FIRST
  11816. C             ABS(IERR) - 1 TRANSFORMATIONS WILL BE USED
  11817. C
  11818. C     ON OUTPUT.
  11819. C
  11820. C        R HAS BEEN OVERWRITTEN BY ITS TRANSFORMED IMAGE
  11821. C
  11822. C     *****APPLICATION AND USAGE RESTRICTIONS.
  11823. C     NONE
  11824. C
  11825. C     *****ALGORITHM NOTES.
  11826. C     THE VECTORS U WHICH DETERMINE THE HOUSEHOLDER TRANSFORMATIONS
  11827. C     ARE NORMALIZED SO THAT THEIR 2-NORM SQUARED IS 2.  THE USE OF
  11828. C     THESE TRANSFORMATIONS HERE IS IN THE SPIRIT OF (1).
  11829. C
  11830. C     *****SUBROUTINES AND FUNCTIONS CALLED.
  11831. C
  11832. C     DOTPRD - FUNCTION, RETURNS THE INNER PRODUCT OF VECTORS
  11833. C
  11834. C     *****REFERENCES.
  11835. C     (1) BUSINGER, P. A., AND GOLUB, G. H. (1965), LINEAR LEAST SQUARES
  11836. C        SOLUTIONS BY HOUSEHOLDER TRANSFORMATIONS, NUMER. MATH. 7,
  11837. C        PP. 269-276.
  11838. C
  11839. C     *****HISTORY.
  11840. C     DESIGNED BY DAVID M. GAY, CODED BY STEPHEN C. PETERS (WINTER 1977)
  11841. C
  11842. C     *****GENERAL.
  11843. C
  11844. C     THIS SUBROUTINE WAS WRITTEN IN CONNECTION WITH RESEARCH
  11845. C     SUPPORTED BY THE NATIONAL SCIENCE FOUNDATION UNDER GRANTS
  11846. C     MCS-7600324, DCR75-10143, 76-14311DSS, AND MCS76-11989.
  11847. C
  11848. C     ..................................................................
  11849. C     ..................................................................
  11850. C
  11851. C     *****LOCAL VARIABLES.
  11852.       INTEGER I, K, L, NL1
  11853.       DOUBLE PRECISION T
  11854. C     *****INTRINSIC FUNCTIONS.
  11855. C/+
  11856.       INTEGER IABS
  11857. C/
  11858. C     *****FUNCTIONS.
  11859.       EXTERNAL DOTPRD
  11860.       DOUBLE PRECISION DOTPRD
  11861. C
  11862.       K = P
  11863.       IF (IERR .NE. 0) K = IABS(IERR) - 1
  11864.       IF ( K .EQ. 0) GO TO 999
  11865. C
  11866.       DO 20 L = 1, K
  11867.          NL1 = N - L + 1
  11868.          T = -DOTPRD(NL1, J(L,L), R(L))
  11869. C
  11870.          DO 10 I = L, N
  11871.  10           R(I) = R(I) + T*J(I,L)
  11872.  20   CONTINUE
  11873.  999  RETURN
  11874. C     .... LAST CARD OF QAPPLY .........................................
  11875.       END
  11876.       SUBROUTINE QRFACT(NM,M,N,QR,ALPHA,IPIVOT,IERR,NOPIVK,SUM)         QRF00010
  11877. C
  11878. C  ***  COMPUTE THE QR DECOMPOSITION OF THE MATRIX STORED IN QR  ***
  11879. C
  11880. C     *****PARAMETERS.
  11881.       INTEGER NM,M,N,IPIVOT(N),IERR,NOPIVK
  11882.       DOUBLE PRECISION  QR(NM,N),ALPHA(N),SUM(N)
  11883. C     *****LOCAL VARIABLES.
  11884.       INTEGER I,J,JBAR,K,K1,MINUM,MK1
  11885.       DOUBLE PRECISION  ALPHAK,BETA,QRKK,QRKMAX,SIGMA,TEMP,UFETA,RKTOL,
  11886.      1        RKTOL1,SUMJ
  11887. C     *****FUNCTIONS.
  11888. C/+
  11889.       INTEGER MIN0
  11890.       DOUBLE PRECISION  DABS,DSQRT
  11891. C/
  11892.       EXTERNAL DOTPRD, RMDCON, VAXPY, VSCOPY, V2NORM
  11893.       DOUBLE PRECISION DOTPRD, RMDCON, V2NORM
  11894. C DOTPRD... RETURNS INNER PRODUCT OF TWO VECTORS.
  11895. C RMDCON... RETURNS MACHINE-DEPENDENT CONSTANTS.
  11896. C VAXPY... COMPUTES SCALAR TIMES ONE VECTOR PLUS ANOTHER.
  11897. C VSCOPY... SETS ALL ELEMENTS OF A VECTOR TO A SCALAR.
  11898. C V2NORM... RETURNS THE 2-NORM OF A VECTOR.
  11899. C
  11900. C     *****CONSTANTS.
  11901.       DOUBLE PRECISION ONE, P01, P99, ZERO
  11902. C/6
  11903.       DATA ONE/1.0D+0/, P01/0.01D+0/, P99/0.99D+0/, ZERO/0.0D+0/
  11904. C/7
  11905. C     PARAMETER (ONE=1.0D+0, P01=0.01D+0, P99=0.99D+0, ZERO=0.0D+0)
  11906. C     SAVE RKTOL, UFETA
  11907. C/
  11908. C
  11909. C
  11910. C     ..................................................................
  11911. C     ..................................................................
  11912. C
  11913. C
  11914. C     *****PURPOSE.
  11915. C
  11916. C     THIS SUBROUTINE DOES A QR-DECOMPOSITION ON THE M X N MATRIX QR,
  11917. C        WITH AN OPTIONALLY MODIFIED COLUMN PIVOTING, AND RETURNS THE
  11918. C        UPPER TRIANGULAR R-MATRIX, AS WELL AS THE ORTHOGONAL VECTORS
  11919. C        USED IN THE TRANSFORMATIONS.
  11920. C
  11921. C     *****PARAMETER DESCRIPTION.
  11922. C     ON INPUT.
  11923. C
  11924. C        NM MUST BE SET TO THE ROW DIMENSION OF THE TWO DIMENSIONAL
  11925. C             ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
  11926. C             DIMENSION STATEMENT.
  11927. C
  11928. C        M MUST BE SET TO THE NUMBER OF ROWS IN THE MATRIX.
  11929. C
  11930. C        N MUST BE SET TO THE NUMBER OF COLUMNS IN THE MATRIX.
  11931. C
  11932. C        QR CONTAINS THE REAL RECTANGULAR MATRIX TO BE DECOMPOSED.
  11933. C
  11934. C     NOPIVK IS USED TO CONTROL PIVOTTING.  COLUMNS 1 THROUGH
  11935. C        NOPIVK WILL REMAIN FIXED IN POSITION.
  11936. C
  11937. C        SUM IS USED FOR TEMPORARY STORAGE FOR THE SUBROUTINE.
  11938. C
  11939. C     ON OUTPUT.
  11940. C
  11941. C        QR CONTAINS THE NON-DIAGONAL ELEMENTS OF THE R-MATRIX
  11942. C             IN THE STRICT UPPER TRIANGLE. THE VECTORS U, WHICH
  11943. C             DEFINE THE HOUSEHOLDER TRANSFORMATIONS   I - U*U-TRANSP,
  11944. C             ARE IN THE COLUMNS OF THE LOWER TRIANGLE. THESE VECTORS U
  11945. C             ARE SCALED SO THAT THE SQUARE OF THEIR 2-NORM IS 2.0.
  11946. C
  11947. C        ALPHA CONTAINS THE DIAGONAL ELEMENTS OF THE R-MATRIX.
  11948. C
  11949. C        IPIVOT REFLECTS THE COLUMN PIVOTING PERFORMED ON THE INPUT
  11950. C             MATRIX TO ACCOMPLISH THE DECOMPOSITION. THE J-TH
  11951. C             ELEMENT OF IPIVOT GIVES THE COLUMN OF THE ORIGINAL
  11952. C             MATRIX WHICH WAS PIVOTED INTO COLUMN J DURING THE
  11953. C             DECOMPOSITION.
  11954. C
  11955. C        IERR IS SET TO.
  11956. C             0 FOR NORMAL RETURN,
  11957. C             K IF NO NON-ZERO PIVOT COULD BE FOUND FOR THE K-TH
  11958. C                  TRANSFORMATION, OR
  11959. C             -K FOR AN ERROR EXIT ON THE K-TH THANSFORMATION.
  11960. C             IF AN ERROR EXIT WAS TAKEN, THE FIRST (K - 1)
  11961. C             TRANSFORMATIONS ARE CORRECT.
  11962. C
  11963. C
  11964. C     *****APPLICATIONS AND USAGE RESTRICTIONS.
  11965. C     THIS MAY BE USED WHEN SOLVING LINEAR LEAST-SQUARES PROBLEMS --
  11966. C     SEE SUBROUTINE QR1 OF ROSEPACK.  IT IS CALLED FOR THIS PURPOSE
  11967. C     BY LLSQST IN THE NL2SOL (NONLINEAR LEAST-SQUARES) PACKAGE.
  11968. C
  11969. C     *****ALGORITHM NOTES.
  11970. C     THIS VERSION OF QRFACT TRIES TO ELIMINATE THE OCCURRENCE OF
  11971. C     UNDERFLOWS DURING THE ACCUMULATION OF INNER PRODUCTS.  RKTOL1
  11972. C     IS CHOSEN BELOW SO AS TO INSURE THAT DISCARDED TERMS HAVE NO
  11973. C     EFFECT ON THE COMPUTED TWO-NORMS.
  11974. C
  11975. C     ADAPTED FROM THE ALGOL ROUTINE SOLVE (1).
  11976. C
  11977. C     *****REFERENCES.
  11978. C     (1)     BUSINGER,P. AND GOLUB,G.H., LINEAR LEAST SQUARES
  11979. C     SOLUTIONS BY HOUSHOLDER TRANSFORMATIONS, IN WILKINSON,J.H.
  11980. C     AND REINSCH,C.(EDS.), HANDBOOK FOR AUTOMATIC COMPUTATION,
  11981. C     VOLUME II. LINEAR ALGEBRA, SPRINGER-VERLAG, 111-118 (1971).
  11982. C     PREPUBLISHED IN NUMER.MATH. 7, 269-276 (1965).
  11983. C
  11984. C     *****HISTORY.
  11985. C     THIS AMOUNTS TO THE SUBROUTINE QR1 OF ROSEPACK WITH RKTOL1 USED
  11986. C     IN PLACE OF RKTOL BELOW, WITH V2NORM USED TO INITIALIZE (AND
  11987. C     SOMETIMES UPDATE) THE SUM ARRAY, AND WITH CALLS ON DOTPRD AND
  11988. C     VAXPY IN PLACE OF SOME LOOPS.
  11989. C
  11990. C     *****GENERAL.
  11991. C
  11992. C     DEVELOPMENT OF THIS PROGRAM SUPPORTED IN PART BY
  11993. C     NATIONAL SCIENCE FOUNDATION GRANT GJ-1154X3 AND
  11994. C     NATIONAL SCIENCE FOUNDATION GRANT DCR75-08802
  11995. C     TO NATIONAL BUREAU OF ECONOMIC RESEARCH, INC.
  11996. C
  11997. C
  11998. C
  11999. C     ..................................................................
  12000. C     ..................................................................
  12001. C
  12002. C
  12003. C     ..........  UFETA IS THE SMALLEST POSITIVE FLOATING POINT NUMBER
  12004. C        S.T. UFETA AND -UFETA CAN BOTH BE REPRESENTED.
  12005. C
  12006. C     ..........  RKTOL IS THE SQUARE ROOT OF THE RELATIVE PRECISION
  12007. C        OF FLOATING POINT ARITHMETIC (MACHEP).
  12008.       DATA RKTOL/0.D+0/, UFETA/0.D+0/
  12009. C     *****BODY OF PROGRAM.
  12010.       IF (UFETA .GT. ZERO) GO TO 10
  12011.          UFETA = RMDCON(1)
  12012.          RKTOL = RMDCON(4)
  12013.    10 IERR = 0
  12014.       RKTOL1 = P01 * RKTOL
  12015. C
  12016.       DO 20 J=1,N
  12017.          SUM(J) = V2NORM(M, QR(1,J))
  12018.          IPIVOT(J) = J
  12019.    20 CONTINUE
  12020. C
  12021.       MINUM = MIN0(M,N)
  12022. C
  12023.       DO 120 K=1,MINUM
  12024.          MK1 = M - K + 1
  12025. C        ..........K-TH HOUSEHOLDER TRANSFORMATION..........
  12026.          SIGMA = ZERO
  12027.          JBAR = 0
  12028. C        ..........FIND LARGEST COLUMN SUM..........
  12029.       IF (K .LE. NOPIVK) GO TO 50
  12030.          DO 30 J=K,N
  12031.               IF (SIGMA .GE. SUM(J))  GO TO 30
  12032.               SIGMA = SUM(J)
  12033.               JBAR = J
  12034.    30    CONTINUE
  12035. C
  12036.          IF (JBAR .EQ. 0)  GO TO 220
  12037.          IF (JBAR .EQ. K)  GO TO 50
  12038. C        ..........COLUMN INTERCHANGE..........
  12039.          I = IPIVOT(K)
  12040.          IPIVOT(K) = IPIVOT(JBAR)
  12041.          IPIVOT(JBAR) = I
  12042.          SUM(JBAR) = SUM(K)
  12043.          SUM(K) = SIGMA
  12044. C
  12045.          DO 40 I=1,M
  12046.               SIGMA = QR(I,K)
  12047.               QR(I,K) = QR(I,JBAR)
  12048.               QR(I,JBAR) = SIGMA
  12049.    40    CONTINUE
  12050. C        ..........END OF COLUMN INTERCHANGE..........
  12051.    50    CONTINUE
  12052. C        ..........  SECOND INNER PRODUCT  ..........
  12053.          QRKMAX = ZERO
  12054. C
  12055.          DO 60 I=K,M
  12056.               IF (DABS( QR(I,K) ) .GT. QRKMAX)  QRKMAX = DABS( QR(I,K) )
  12057.    60    CONTINUE
  12058. C
  12059.          IF (QRKMAX .LT. UFETA)  GO TO 210
  12060.          ALPHAK = V2NORM(MK1, QR(K,K)) / QRKMAX
  12061.          SIGMA = ALPHAK**2
  12062. C
  12063. C        ..........  END SECOND INNER PRODUCT  ..........
  12064.          QRKK = QR(K,K)
  12065.          IF (QRKK .GE. ZERO)  ALPHAK = -ALPHAK
  12066.          ALPHA(K) = ALPHAK * QRKMAX
  12067.          BETA = QRKMAX * DSQRT(SIGMA - (QRKK*ALPHAK/QRKMAX) )
  12068.          QR(K,K) = QRKK - ALPHA(K)
  12069.          DO 65 I=K,M
  12070.    65         QR(I,K) =  QR(I,K) / BETA
  12071.          K1 = K + 1
  12072.          IF (K1 .GT. N) GO TO 120
  12073. C
  12074.          DO 110 J = K1, N
  12075.               TEMP = -DOTPRD(MK1, QR(K,K), QR(K,J))
  12076. C
  12077. C             ***  SET QR(I,J) = QR(I,J) + TEMP*QR(I,K), I = K,...,M.
  12078. C
  12079.               CALL VAXPY(MK1, QR(K,J), TEMP, QR(K,K), QR(K,J))
  12080. C
  12081.               IF (K1 .GT. M) GO TO 110
  12082.               SUMJ = SUM(J)
  12083.               IF (SUMJ .LT. UFETA) GO TO 110
  12084.               TEMP = DABS(QR(K,J)/SUMJ)
  12085.               IF (TEMP .LT. RKTOL1) GO TO 110
  12086.               IF (TEMP .GE. P99) GO TO 90
  12087.                    SUM(J) = SUMJ * DSQRT(ONE - TEMP**2)
  12088.                    GO TO 110
  12089.    90         SUM(J) = V2NORM(M-K, QR(K1,J))
  12090.   110    CONTINUE
  12091. C        ..........END OF K-TH HOUSEHOLDER TRANSFORMATION..........
  12092.   120 CONTINUE
  12093. C
  12094.       GO TO 999
  12095. C     ..........ERROR EXIT ON K-TH TRANSFORMATION..........
  12096.   210 IERR = -K
  12097.       GO TO 230
  12098. C     ..........NO NON-ZERO ACCEPTABLE PIVOT FOUND..........
  12099.   220 IERR = K
  12100.   230 DO 240 I = K, N
  12101.          ALPHA(I) = ZERO
  12102.          IF (I .GT. K) CALL VSCOPY(I-K, QR(K,I), ZERO)
  12103.  240     CONTINUE
  12104. C     ..........RETURN TO CALLER..........
  12105.   999 RETURN
  12106. C     ..........LAST CARD OF QRFACT..........
  12107.       END
  12108.       DOUBLE PRECISION FUNCTION RELDST(P, D, X, X0)                     REL00010
  12109. C
  12110. C  ***  COMPUTE AND RETURN RELATIVE DIFFERENCE BETWEEN X AND X0  ***
  12111. C  ***  NL2SOL VERSION 2.2  ***
  12112. C
  12113.       INTEGER P
  12114.       DOUBLE PRECISION D(P), X(P), X0(P)
  12115. C/+
  12116.       DOUBLE PRECISION DABS
  12117. C/
  12118.       INTEGER I
  12119.       DOUBLE PRECISION EMAX, T, XMAX, ZERO
  12120. C/6
  12121.       DATA ZERO/0.D+0/
  12122. C/7
  12123. C     PARAMETER (ZERO=0.D+0)
  12124. C/
  12125. C
  12126.       EMAX = ZERO
  12127.       XMAX = ZERO
  12128.       DO 10 I = 1, P
  12129.          T = DABS(D(I) * (X(I) - X0(I)))
  12130.          IF (EMAX .LT. T) EMAX = T
  12131.          T = D(I) * (DABS(X(I)) + DABS(X0(I)))
  12132.          IF (XMAX .LT. T) XMAX = T
  12133.  10      CONTINUE
  12134.       RELDST = ZERO
  12135.       IF (XMAX .GT. ZERO) RELDST = EMAX / XMAX
  12136.  999  RETURN
  12137. C  ***  LAST CARD OF RELDST FOLLOWS  ***
  12138.       END
  12139.       SUBROUTINE RPTMUL(FUNC, IPIVOT, J, NN, P, RD, X, Y, Z)            RPT00010
  12140. C
  12141. C  ***  FUNC = 1... SET  Y = RMAT * (PERM**T) * X.
  12142. C  ***  FUNC = 2... SET  Y = PERM * (RMAT**T) * RMAT * (PERM**T) * X.
  12143. C  ***  FUNC = 3... SET  Y = PERM * (RMAT**T) X.
  12144. C
  12145. C
  12146. C  ***  PERM = MATRIX WHOSE I-TH COL. IS THE IPIVOT(I)-TH UNIT VECTOR.
  12147. C  ***  RMAT IS THE UPPER TRIANGULAR MATRIX WHOSE STRICT UPPER TRIANGLE
  12148. C  ***       IS STORED IN  J  AND WHOSE DIAGONAL IS STORED IN RD.
  12149. C  ***  Z IS A SCRATCH VECTOR.
  12150. C  ***  X AND Y MAY SHARE STORAGE.
  12151. C
  12152.       INTEGER FUNC, NN, P
  12153.       INTEGER IPIVOT(P)
  12154.       DOUBLE PRECISION J(NN,P), RD(P), X(P), Y(P), Z(P)
  12155. C
  12156. C  ***  LOCAL VARIABLES  ***
  12157. C
  12158.       INTEGER I, IM1, K, KM1
  12159.       DOUBLE PRECISION ZK
  12160. C
  12161. C  ***  EXTERNAL FUNCTION  ***
  12162. C
  12163.       EXTERNAL DOTPRD
  12164.       DOUBLE PRECISION DOTPRD
  12165. C
  12166. C-----------------------------------------------------------------------
  12167. C
  12168.       IF (FUNC .GT. 2) GO TO 50
  12169. C
  12170. C  ***  FIRST SET  Z = (PERM**T) * X  ***
  12171. C
  12172.       DO 10 I = 1, P
  12173.          K = IPIVOT(I)
  12174.          Z(I) = X(K)
  12175.  10      CONTINUE
  12176. C
  12177. C  ***  NOW SET  Y = RMAT * Z  ***
  12178. C
  12179.       Y(1) = Z(1) * RD(1)
  12180.       IF (P .LE. 1) GO TO 40
  12181.       DO 30 K = 2, P
  12182.          KM1 = K - 1
  12183.          ZK = Z(K)
  12184.          DO 20 I = 1, KM1
  12185.  20           Y(I) = Y(I) + J(I,K)*ZK
  12186.          Y(K) = ZK*RD(K)
  12187.  30      CONTINUE
  12188. C
  12189.  40   IF (FUNC .LE. 1) GO TO 999
  12190.       GO TO 70
  12191. C
  12192.  50   DO 60 I = 1, P
  12193.  60      Y(I) = X(I)
  12194. C
  12195. C  ***  SET  Z = (RMAT**T) * Y  ***
  12196. C
  12197.  70   Z(1) = Y(1) * RD(1)
  12198.       IF (P .EQ. 1) GO TO 90
  12199.       DO 80 I = 2, P
  12200.          IM1 = I - 1
  12201.          Z(I) = Y(I)*RD(I) + DOTPRD(IM1, J(1,I), Y)
  12202.  80      CONTINUE
  12203. C
  12204. C  ***  NOW SET  Y = PERM * Z  ***
  12205. C
  12206.  90   DO 100 I = 1, P
  12207.          K = IPIVOT(I)
  12208.          Y(K) = Z(I)
  12209.  100     CONTINUE
  12210. C
  12211.  999  RETURN
  12212. C  ***  LAST CARD OF RPTMUL FOLLOWS  ***
  12213.       END
  12214.       SUBROUTINE SLUPDT(A, COSMIN, P, SIZE, STEP, U, W, WCHMTD, WSCALE, SLU00010
  12215.      1                  Y)
  12216. C
  12217. C  ***  UPDATE SYMMETRIC  A  SO THAT  A * STEP = Y  ***
  12218. C  ***  (LOWER TRIANGLE OF  A  STORED ROWWISE       ***
  12219. C
  12220. C  ***  PARAMETER DECLARATIONS  ***
  12221. C
  12222.       INTEGER P
  12223.       DOUBLE PRECISION A(1), COSMIN, SIZE, STEP(P), U(P), W(P),
  12224.      1                 WCHMTD(P), WSCALE, Y(P)
  12225. C     DIMENSION A(P*(P+1)/2)
  12226. C
  12227. C  ***  LOCAL VARIABLES  ***
  12228. C
  12229.       INTEGER I, J, K
  12230.       DOUBLE PRECISION DENMIN, SDOTWM, T, UI, WI
  12231. C
  12232. C     ***  CONSTANTS  ***
  12233.       DOUBLE PRECISION HALF, ONE, ZERO
  12234. C
  12235. C  ***  INTRINSIC FUNCTIONS  ***
  12236. C/+
  12237.       DOUBLE PRECISION DABS, DMIN1
  12238. C/
  12239. C  ***  EXTERNAL FUNCTIONS AND SUBROUTINES  ***
  12240. C
  12241.       EXTERNAL DOTPRD, SLVMUL, V2NORM
  12242.       DOUBLE PRECISION DOTPRD, V2NORM
  12243. C
  12244. C/6
  12245.       DATA HALF/0.5D+0/, ONE/1.D+0/, ZERO/0.D+0/
  12246. C/7
  12247. C     PARAMETER (HALF=0.5D+0, ONE=1.D+0, ZERO=0.D+0)
  12248. C/
  12249. C
  12250. C-----------------------------------------------------------------------
  12251. C
  12252.       SDOTWM = DOTPRD(P, STEP, WCHMTD)
  12253.       DENMIN = COSMIN * V2NORM(P,STEP) * V2NORM(P,WCHMTD)
  12254.       WSCALE = ONE
  12255.       IF (DENMIN .NE. ZERO) WSCALE = DMIN1(ONE, DABS(SDOTWM/DENMIN))
  12256.       T = ZERO
  12257.       IF (SDOTWM .NE. ZERO) T = WSCALE / SDOTWM
  12258.       DO 10 I = 1, P
  12259.  10      W(I) = T * WCHMTD(I)
  12260.       CALL SLVMUL(P, U, A, STEP)
  12261.       T = HALF * (SIZE * DOTPRD(P, STEP, U)  -  DOTPRD(P, STEP, Y))
  12262.       DO 20 I = 1, P
  12263.  20      U(I) = T*W(I) + Y(I) - SIZE*U(I)
  12264. C
  12265. C  ***  SET  A = A + U*(W**T) + W*(U**T)  ***
  12266. C
  12267.       K = 1
  12268.       DO 40 I = 1, P
  12269.          UI = U(I)
  12270.          WI = W(I)
  12271.          DO 30 J = 1, I
  12272.               A(K) = SIZE*A(K) + UI*W(J) + WI*U(J)
  12273.               K = K + 1
  12274.  30           CONTINUE
  12275.  40      CONTINUE
  12276. C
  12277.  999  RETURN
  12278. C  ***  LAST CARD OF SLUPDT FOLLOWS  ***
  12279.       END
  12280.       SUBROUTINE SLVMUL(P, Y, S, X)                                     SLV00010
  12281. C
  12282. C  ***  SET  Y = S * X,  S = P X P SYMMETRIC MATRIX.  ***
  12283. C  ***  LOWER TRIANGLE OF  S  STORED ROWWISE.         ***
  12284. C
  12285. C  ***  PARAMETER DECLARATIONS  ***
  12286. C
  12287.       INTEGER P
  12288.       DOUBLE PRECISION S(1), X(P), Y(P)
  12289. C     DIMENSION S(P*(P+1)/2)
  12290. C
  12291. C  ***  LOCAL VARIABLES  ***
  12292. C
  12293.       INTEGER I, IM1, J, K
  12294.       DOUBLE PRECISION XI
  12295. C
  12296. C  ***  NO INTRINSIC FUNCTIONS  ***
  12297. C
  12298. C  ***  EXTERNAL FUNCTION  ***
  12299. C
  12300.       EXTERNAL DOTPRD
  12301.       DOUBLE PRECISION DOTPRD
  12302. C
  12303. C-----------------------------------------------------------------------
  12304. C
  12305.       J = 1
  12306.       DO 10 I = 1, P
  12307.          Y(I) = DOTPRD(I, S(J), X)
  12308.          J = J + I
  12309.  10      CONTINUE
  12310. C
  12311.       IF (P .LE. 1) GO TO 999
  12312.       J = 1
  12313.       DO 40 I = 2, P
  12314.          XI = X(I)
  12315.          IM1 = I - 1
  12316.          J = J + 1
  12317.          DO 30 K = 1, IM1
  12318.               Y(K) = Y(K) + S(J)*XI
  12319.               J = J + 1
  12320.  30           CONTINUE
  12321.  40      CONTINUE
  12322. C
  12323.  999  RETURN
  12324. C  ***  LAST CARD OF SLVMUL FOLLOWS  ***
  12325.       END
  12326.       LOGICAL FUNCTION STOPX(IDUMMY)                                    STO00010
  12327. C     *****PARAMETERS...
  12328.       INTEGER IDUMMY
  12329. C
  12330. C     ..................................................................
  12331. C
  12332. C     *****PURPOSE...
  12333. C     THIS FUNCTION MAY SERVE AS THE STOPX (ASYNCHRONOUS INTERRUPTION)
  12334. C     FUNCTION FOR THE NL2SOL (NONLINEAR LEAST-SQUARES) PACKAGE AT
  12335. C     THOSE INSTALLATIONS WHICH DO NOT WISH TO IMPLEMENT A
  12336. C     DYNAMIC STOPX.
  12337. C
  12338. C     *****ALGORITHM NOTES...
  12339. C     AT INSTALLATIONS WHERE THE NL2SOL SYSTEM IS USED
  12340. C     INTERACTIVELY, THIS DUMMY STOPX SHOULD BE REPLACED BY A
  12341. C     FUNCTION THAT RETURNS .TRUE. IF AND ONLY IF THE INTERRUPT
  12342. C     (BREAK) KEY HAS BEEN PRESSED SINCE THE LAST CALL ON STOPX.
  12343. C
  12344. C     ..................................................................
  12345. C
  12346.       STOPX = .FALSE.
  12347.       RETURN
  12348.       END
  12349.       SUBROUTINE VAXPY(P, W, A, X, Y)                                   VAX00010
  12350. C
  12351. C  ***  SET W = A*X + Y  --  W, X, Y = P-VECTORS, A = SCALAR  ***
  12352. C
  12353.       INTEGER P
  12354.       DOUBLE PRECISION A, W(P), X(P), Y(P)
  12355. C
  12356.       INTEGER I
  12357. C
  12358.       DO 10 I = 1, P
  12359.  10      W(I) = A*X(I) + Y(I)
  12360.       RETURN
  12361.       END
  12362.       SUBROUTINE VCOPY(P, Y, X)                                         VCO00010
  12363. C
  12364. C  ***  SET Y = X, WHERE X AND Y ARE P-VECTORS  ***
  12365. C
  12366.       INTEGER P
  12367.       DOUBLE PRECISION X(P), Y(P)
  12368. C
  12369.       INTEGER I
  12370. C
  12371.       DO 10 I = 1, P
  12372.  10      Y(I) = X(I)
  12373.       RETURN
  12374.       END
  12375.       SUBROUTINE VSCOPY(P, Y, S)                                        VSC00010
  12376. C
  12377. C  ***  SET P-VECTOR Y TO SCALAR S  ***
  12378. C
  12379.       INTEGER P
  12380.       DOUBLE PRECISION S, Y(P)
  12381. C
  12382.       INTEGER I
  12383. C
  12384.       DO 10 I = 1, P
  12385.  10      Y(I) = S
  12386.       RETURN
  12387.       END
  12388.       DOUBLE PRECISION FUNCTION V2NORM(P, X)                            V2N00010
  12389. C
  12390. C  ***  RETURN THE 2-NORM OF THE P-VECTOR X, TAKING  ***
  12391. C  ***  CARE TO AVOID THE MOST LIKELY UNDERFLOWS.    ***
  12392. C
  12393.       INTEGER P
  12394.       DOUBLE PRECISION X(P)
  12395. C
  12396.       INTEGER I, J
  12397.       DOUBLE PRECISION ONE, R, SCALE, SQTETA, T, XI, ZERO
  12398. C/+
  12399.       DOUBLE PRECISION DABS, DSQRT
  12400. C/
  12401.       EXTERNAL RMDCON
  12402.       DOUBLE PRECISION RMDCON
  12403. C
  12404. C/6
  12405.       DATA ONE/1.D+0/, ZERO/0.D+0/
  12406. C/7
  12407. C     PARAMETER (ONE=1.D+0, ZERO=0.D+0)
  12408. C     SAVE SQTETA
  12409. C/
  12410.       DATA SQTETA/0.D+0/
  12411. C
  12412.       IF (P .GT. 0) GO TO 10
  12413.          V2NORM = ZERO
  12414.          GO TO 999
  12415.  10   DO 20 I = 1, P
  12416.          IF (X(I) .NE. ZERO) GO TO 30
  12417.  20      CONTINUE
  12418.       V2NORM = ZERO
  12419.       GO TO 999
  12420. C
  12421.  30   SCALE = DABS(X(I))
  12422.       IF (I .LT. P) GO TO 40
  12423.          V2NORM = SCALE
  12424.          GO TO 999
  12425.  40   T = ONE
  12426.       IF (SQTETA .EQ. ZERO) SQTETA = RMDCON(2)
  12427. C
  12428. C     ***  SQTETA IS (SLIGHTLY LARGER THAN) THE SQUARE ROOT OF THE
  12429. C     ***  SMALLEST POSITIVE FLOATING POINT NUMBER ON THE MACHINE.
  12430. C     ***  THE TESTS INVOLVING SQTETA ARE DONE TO PREVENT UNDERFLOWS.
  12431. C
  12432.       J = I + 1
  12433.       DO 60 I = J, P
  12434.          XI = DABS(X(I))
  12435.          IF (XI .GT. SCALE) GO TO 50
  12436.               R = XI / SCALE
  12437.               IF (R .GT. SQTETA) T = T + R*R
  12438.               GO TO 60
  12439.  50           R = SCALE / XI
  12440.               IF (R .LE. SQTETA) R = ZERO
  12441.               T = ONE  +  T * R*R
  12442.          SCALE = XI
  12443.  60      CONTINUE
  12444. C
  12445.       V2NORM = SCALE * DSQRT(T)
  12446.  999  RETURN
  12447. C  ***  LAST CARD OF V2NORM FOLLOWS  ***
  12448.       END
  12449. C///////////////////////////////////////////////////////////////////////
  12450. C  ***  RUN NL2SOL ON VARIOUS TEST PROBLEMS, PRINT SUMMARY STATISTICS.  NLM00010
  12451. C
  12452. C     *****COMMON STORAGE WITH NLTEST.
  12453. C
  12454.       COMMON /TESTCM/ V, RS, JAC, NOUT, NPROB, XSCAL1, XSCAL2, IS, IV
  12455.       COMMON /TESTCH/ NAME, IRC
  12456.       INTEGER IS(6,50), IV(80), JAC, NOUT, NPROB, XSCAL1, XSCAL2
  12457.       REAL RS(5,50)
  12458. C/6
  12459.       REAL NAME(2,50)
  12460.       INTEGER IRC(50)
  12461. C/7
  12462. C     CHARACTER NAME(2,50)*4, IRC(50)*1
  12463. C/
  12464.       DOUBLE PRECISION V(1736)
  12465. C
  12466. C
  12467. C     ..................................................................
  12468. C
  12469. C     *****PURPOSE.
  12470. C        THIS MAIN PROGRAM CALLS NLTEST TO RUN NL2SOL, THE NONLINEAR
  12471. C     LEAST-SQUARES SOLVER OF REF. 1, ON VARIOUS TEST PROBLEMS.
  12472. C
  12473. C
  12474. C     *****APPLICATION AND USAGE RESTRICTIONS.
  12475. C     THIS MAIN DRIVER IS INTENDED TO CHECK WHETHER THE NL2SOL
  12476. C     (NONLINEAR LEAST-SQUARES) PACKAGE WAS SUCCESSFULLY
  12477. C     TRANSPORTED TO A NEW MACHINE.
  12478. C
  12479. C     *****ALGORITHM NOTES.
  12480. C     THE TEST PROBLEMS USED ARE FROM REFERENCES (2), (3), AND (4).
  12481. C     SOME ADDITIONAL TEST PROBLEMS WERE SUGGESTED BY JORGE MORE (PRI-
  12482. C     VATE COMMUNICATION).  CALLS PASSING THESE PROBLEMS TO NLTEST HAVE
  12483. C     BEEN COMMENTED OUT (SINCE THERE ARE ENOUGH OTHER PROBLEMS), BUT
  12484. C     NOT REMOVED, SINCE THEY MAY BE OF INTEREST TO OTHER RESEARCHERS.
  12485. C
  12486. C     *****FUNCTIONS AND SUBROUTINES CALLED.
  12487. C
  12488. C        DFAULT - ESTABLISHES THE DEFAULT PARAMETER SETTINGS FOR
  12489. C                 IV AND V.
  12490. C
  12491. C        IMDCON - IMDCON(2) RETURNS I/O UNIT NUMBER ON WHICH NLTEST
  12492. C                  WRITES A SUMMARY OF EACH TEST RUN.
  12493. C
  12494. C        IVVSET - SUPPLIES NONDEFAULT VALUES FOR IV AND V.
  12495. C
  12496. C        NLTEST - CALLS NL2SOL, THE NONLINEAR LEAST-SQUARES
  12497. C                  PROBLEM SOLVER.
  12498. C
  12499. C        TODAY  - SUPPLIES DATE AND TIME (OR CURRENT VERSION OF NL2SOL).
  12500. C
  12501. C     *****REFERENCES.
  12502. C
  12503. C     (1). DENNIS, J.E.. GAY, D.M.. AND WELSCH, R.E. (1980),
  12504. C          AN ADAPTIVE NONLINEAR LEAST-SQUARES ALGORITHM,
  12505. C          SUBMITTED TO ACM TRANS. MATH. SOFTWARE.
  12506. C          UNDER REVISION.
  12507. C
  12508. C     (2). GILL, P.E.. AND MURRAY, W. (1976),ALGORITHMS FOR THE
  12509. C          SOLUTION OF THE NON-LINEAR LEAST-SQUARES PROBLEM,
  12510. C          NPL REPORT NAC71,(NATIONAL PHYSICAL LABORATORY,
  12511. C          DIVISION OF NUMERICAL ANALYSIS AND COMPUTING,
  12512. C          TEDDINGTON,MIDDLESEX,ENGLAND).
  12513. C
  12514. C     (3) MEYER, R.R. (1970), THEORETICAL AND COMPUTATIONAL ASPECTS
  12515. C        OF NONLINEAR REGRESSION, PP. 465-486 OF NONLINEAR PROGRAMMING,
  12516. C        EDITED BY J.B. ROSEN, O.L.MANGASARIAN, AND K. RITTER,
  12517. C        ACADEMIC PRESS, NEW YORK.
  12518. C
  12519. C     (4) BROWN, K.M. (1969), A QUADRATICALLY CONVERGENT NEWTON-
  12520. C        LIKE METHOD BASED UPON GAUSSIAN ELIMINATION,
  12521. C        SIAM J. NUMER. ANAL. 6, PP. 560-569.
  12522. C
  12523. C     *****GENERAL.
  12524. C
  12525. C     THIS SUBROUTINE WAS WRITTEN IN CONNECTION WITH RESEARCH
  12526. C     SUPPORTED BY THE NATIONAL SCIENCE FOUNDATION UNDER GRANTS
  12527. C     MCS-7600324, DCR75-10143, 76-14311DSS, AND MCS76-11989.
  12528. C
  12529. C     ..................................................................
  12530. C     ..................................................................
  12531. C
  12532. C     *****INTRINSIC FUNCTIONS.
  12533. C/+
  12534.       INTEGER MOD
  12535.       DOUBLE PRECISION DMAX1
  12536. C/
  12537. C     *****EXTERNAL FUNCTIONS AND SUBROUTINES.
  12538.       EXTERNAL DFAULT, IMDCON, IVVSET, NLTEST, TODAY
  12539.       INTEGER IMDCON
  12540. C
  12541. C     *****LOCAL VARIABLES.
  12542.       LOGICAL RSTART
  12543.       INTEGER I, J, K, MXFCSV, MXITSV, PU
  12544. C/6
  12545.       INTEGER JTYP(2)
  12546.       REAL DATIME(4)
  12547. C/7
  12548. C     CHARACTER DATIME(4)*4, JTYP(2)*1
  12549. C/
  12550. C
  12551. C/6
  12552.       DATA RSTART/.FALSE./, JTYP(1),JTYP(2)/1H ,1H*/
  12553. C/7
  12554. C     DATA RSTART/.FALSE./, JTYP(1),JTYP(2)/' ','*'/
  12555. C/
  12556. C
  12557. C-----------------------------------------------------------------------
  12558. C
  12559. C  ***  ESTABLISH DEFAULT PARAMETER SETTINGS  ***
  12560.       CALL DFAULT (IV, V)
  12561.       NOUT = IMDCON(2)
  12562. C
  12563. C  ***  NON-DEFAULT PARAMETER SETTINGS  ***
  12564. C
  12565.       CALL IVVSET(IV, V)
  12566.       PU = IV(21)
  12567. C
  12568.       JAC = 1
  12569.       NPROB = 0
  12570.       XSCAL1 = 1
  12571.       XSCAL2 = 3
  12572. C
  12573. C/6
  12574.       CALL NLTEST(2,2,1,4HROSN,4HBROK,RSTART)
  12575.       CALL NLTEST(3,3,2,4HHELI,4HX   ,RSTART)
  12576.       CALL NLTEST(4,4,3,4HSING,4HULAR,RSTART)
  12577.       CALL NLTEST(7,4,4,4HWOOD,4HS   ,RSTART)
  12578.       XSCAL2 = 1
  12579.       CALL NLTEST(3,3,5,4HZANG,4HWILL,RSTART)
  12580.       XSCAL2 = 3
  12581.       CALL NLTEST(5,3,6,4HENGV,4HALL ,RSTART)
  12582.       CALL NLTEST(2,2,7,4HBRAN,4HIN  ,RSTART)
  12583.       XSCAL2 = 2
  12584.       CALL NLTEST(3,2,8,4HBEAL,4HE   ,RSTART)
  12585.       CALL NLTEST(5,4,9,4HCRAG,4HG   ,RSTART)
  12586.       XSCAL2 = 2
  12587.       CALL NLTEST(10,3,10,4HBOX ,4H    ,RSTART)
  12588.       MXFCSV = IV(17)
  12589.       MXITSV = IV(18)
  12590.       IV(17) = 20
  12591.       IV(18) = 15
  12592.       XSCAL2 = 1
  12593.       CALL NLTEST(15,15,11,4HDAVI,4HDON1,RSTART)
  12594.       IV(17) = MXFCSV
  12595.       IV(18) = MXITSV
  12596.       XSCAL2 = 3
  12597.       CALL NLTEST(2,2,12,4HFRDS,4HTEIN,RSTART)
  12598.       XSCAL2 = 1
  12599.       CALL NLTEST(31,6,13,4HWATS,4HON6 ,RSTART)
  12600.       CALL NLTEST(31,9,14,4HWATS,4HON9 ,RSTART)
  12601.       CALL NLTEST(31,12,15,4HWATS,4HON12,RSTART)
  12602.       MXFCSV = IV(17)
  12603.       IV(17) = 20
  12604.       MXITSV = IV(18)
  12605.       IV(18) = 15
  12606.       CALL NLTEST(31,20,16,4HWATS,4HON20,RSTART)
  12607.       IV(17) = MXFCSV
  12608.       IV(18) = MXITSV
  12609.       XSCAL2 = 2
  12610.       CALL NLTEST(8,8,17,4HCHEB,4HQD8 ,RSTART)
  12611.       XSCAL2 = 3
  12612.       CALL NLTEST(20,4,18,4HBROW,4HN   ,RSTART)
  12613.       CALL NLTEST(15,3,19,4HBARD,4H    ,RSTART)
  12614.       XSCAL2 = 1
  12615.       CALL NLTEST(10,2,20,4HJENN,4HRICH,RSTART)
  12616.       XSCAL2 = 3
  12617.       CALL NLTEST(11,4,21,4HKOWA,4HLIK ,RSTART)
  12618.       XSCAL2 = 1
  12619.       CALL NLTEST(33,5,22,4HOSBO,4HRNE1,RSTART)
  12620.       XSCAL2 = 2
  12621.       CALL NLTEST(65,11,23,4HOSBO,4HRNE2,RSTART)
  12622.       XSCAL2 = 3
  12623.       CALL NLTEST(3,2,24,4HMADS,4HEN  ,RSTART)
  12624.       XSCAL2 = 1
  12625.       IV(17) = 400
  12626.       IV(18) = 300
  12627.       CALL NLTEST(16,3,25,4HMEYE,4HR   ,RSTART)
  12628. C/7
  12629. C     CALL NLTEST(2,2,1,'ROSN','BROK',RSTART)
  12630. C     CALL NLTEST(3,3,2,'HELI','X   ',RSTART)
  12631. C     CALL NLTEST(4,4,3,'SING','ULAR',RSTART)
  12632. C     CALL NLTEST(7,4,4,'WOOD','S   ',RSTART)
  12633. C     XSCAL2 = 1
  12634. C     CALL NLTEST(3,3,5,'ZANG','WILL',RSTART)
  12635. C     XSCAL2 = 3
  12636. C     CALL NLTEST(5,3,6,'ENGV','ALL ',RSTART)
  12637. C     CALL NLTEST(2,2,7,'BRAN','IN  ',RSTART)
  12638. C     XSCAL2 = 2
  12639. C     CALL NLTEST(3,2,8,'BEAL','E   ',RSTART)
  12640. C     CALL NLTEST(5,4,9,'CRAG','G   ',RSTART)
  12641. C     XSCAL2 = 2
  12642. C     CALL NLTEST(10,3,10,'BOX ','    ',RSTART)
  12643. C     MXFCSV = IV(17)
  12644. C     MXITSV = IV(18)
  12645. C     IV(17) = 20
  12646. C     IV(18) = 15
  12647. C     XSCAL2 = 1
  12648. C     CALL NLTEST(15,15,11,'DAVI','DON1',RSTART)
  12649. C     IV(17) = MXFCSV
  12650. C     IV(18) = MXITSV
  12651. C     XSCAL2 = 3
  12652. C     CALL NLTEST(2,2,12,'FRDS','TEIN',RSTART)
  12653. C     XSCAL2 = 1
  12654. C     CALL NLTEST(31,6,13,'WATS','ON6 ',RSTART)
  12655. C     CALL NLTEST(31,9,14,'WATS','ON9 ',RSTART)
  12656. C     CALL NLTEST(31,12,15,'WATS','ON12',RSTART)
  12657. C     MXFCSV = IV(17)
  12658. C     IV(17) = 20
  12659. C     MXITSV = IV(18)
  12660. C     IV(18) = 15
  12661. C     CALL NLTEST(31,20,16,'WATS','ON20',RSTART)
  12662. C     IV(17) = MXFCSV
  12663. C     IV(18) = MXITSV
  12664. C     XSCAL2 = 2
  12665. C     CALL NLTEST(8,8,17,'CHEB','QD8 ',RSTART)
  12666. C     XSCAL2 = 3
  12667. C     CALL NLTEST(20,4,18,'BROW','N   ',RSTART)
  12668. C     CALL NLTEST(15,3,19,'BARD','    ',RSTART)
  12669. C     XSCAL2 = 1
  12670. C     CALL NLTEST(10,2,20,'JENN','RICH',RSTART)
  12671. C     XSCAL2 = 3
  12672. C     CALL NLTEST(11,4,21,'KOWA','LIK ',RSTART)
  12673. C     XSCAL2 = 1
  12674. C     CALL NLTEST(33,5,22,'OSBO','RNE1',RSTART)
  12675. C     XSCAL2 = 2
  12676. C     CALL NLTEST(65,11,23,'OSBO','RNE2',RSTART)
  12677. C     XSCAL2 = 3
  12678. C     CALL NLTEST(3,2,24,'MADS','EN  ',RSTART)
  12679. C     XSCAL2 = 1
  12680. C     IV(17) = 400
  12681. C     IV(18) = 300
  12682. C     CALL NLTEST(16,3,25,'MEYE','R   ',RSTART)
  12683. C/
  12684. C  ***  BROWN5  ***
  12685. C     CALL NLTEST(5,5,26,4HBROW,4HN5  ,RSTART)
  12686. C  ***  BROWN10  ***
  12687. C     CALL NLTEST(10,10,27,4HBROW,4HN10 ,RSTART)
  12688. C  ***  BROWN30  ***
  12689. C     CALL NLTEST(30,30,28,4HBROW,4HN30 ,RSTART)
  12690. C  ***  BROWN40  ***
  12691. C     CALL NLTEST(40,40,29,4HBROW,4HN40 ,RSTART)
  12692. C  ***  BARD+10 ***
  12693. C     CALL NLTEST(15,3,30,4HBARD,4H+10 ,RSTART)
  12694. C  ***  KOWALIK AND OSBORNE + 10  ***
  12695. C     CALL NLTEST(11,4,31,4HKOWA,4HL+10,RSTART)
  12696. C  ***  MEYER + 10  ***
  12697. C     CALL NLTEST(16,3,32,4HMEYE,4HR+10,RSTART)
  12698. C  ***  WATSON6 + 10  ***
  12699. C     CALL NLTEST(31,6,33,4HWAT6,4H+10 ,RSTART)
  12700. C  ***  WATSON9 + 10  ***
  12701. C     CALL NLTEST(31,9,34,4HWAT9,4H+10 ,RSTART)
  12702. C  ***  WATSON12 + 10  ***
  12703. C     CALL NLTEST(31,12,35,4HWAT1,4H2+10,RSTART)
  12704. C  ***  WATSON20 + 10  ***
  12705. C     CALL NLTEST(31,20,36,4HWAT2,4H0+10,RSTART)
  12706. C
  12707. C  ***  REPEAT TWO TESTS USING FINITE-DIFFERENCE JACOBIAN  ***
  12708. C
  12709.       JAC = 2
  12710.       XSCAL2 = 1
  12711. C
  12712.       IV(17) = 50
  12713.       IV(18) = 40
  12714. C/6
  12715.       CALL NLTEST(2,2,1,4HROSN,4HBROK,RSTART)
  12716. C/7
  12717. C     CALL NLTEST(2,2,1,'ROSN','BROK',RSTART)
  12718. C/
  12719.       V(29) = DMAX1(1.0D-7, V(29))
  12720.       IV(17) = 30
  12721.       IV(18) = 20
  12722. C  ***  BROWN  ***
  12723. C/6
  12724.       CALL NLTEST(20,4,18,4HBROW,4HN   ,RSTART)
  12725. C/7
  12726. C     CALL NLTEST(20,4,18,'BROW','N   ',RSTART)
  12727. C/
  12728. C
  12729.       IF (NPROB .EQ. 0 .OR. PU .EQ. 0) STOP
  12730.       CALL TODAY(DATIME)
  12731.       DO 130 K = 1, NPROB
  12732.          IF (MOD(K,56) .EQ. 1) WRITE(PU, 110) DATIME, NPROB
  12733.  110     FORMAT(1H1,11X,2A4,2X,2A4,10X,10HSUMMARY OF,I4,
  12734.      1          22H NL2SOL TEST RUNS.....,10X,
  12735.      2          32H(* = FINITE-DIFFERENCE JACOBIAN)/
  12736.      3          48H0 PROBLEM    N   P  NITER   NF   NG  IV1  X0SCAL,5X,
  12737.      4          39HFINAL F     PRELDF     NRELDF     RELDX/)
  12738.          J = IS(6,K)
  12739.          WRITE(PU,120) JTYP(J), NAME(1,K), NAME(2,K),
  12740.      1                 (IS(I,K), I=1,5), IRC(K), (RS(I,K), I=1,5)
  12741.  120     FORMAT(1X,A1,2A4,2I4,I7,2I5,3X,A1,F9.1,E13.3,3E11.3)
  12742.  130     CONTINUE
  12743. C
  12744.       STOP
  12745. C...... LAST CARD OF NLMAIN ............................................
  12746.       END
  12747.       SUBROUTINE IVVSET(IV, V)                                          IVV00010
  12748. C
  12749. C  ***  SUPPLY NONDEFAULT IV AND V VALUES FOR NLMAIN  (NL2SOL VER. 2.2).
  12750. C
  12751.       INTEGER IV(24)
  12752.       DOUBLE PRECISION V(100)
  12753. C
  12754. C     ACTIVATE THE NEXT LINE TO TURN OFF DETAILED SUMMARY PRINTING
  12755. C     IV(21) = 0
  12756.       RETURN
  12757.       END
  12758.       SUBROUTINE NLTEST (N, P, NEX, TITLE1, TITLE2, RSTART)             NLT00010
  12759. C
  12760. C  ***  CALL NL2SOL, SAVE AND PRINT STATISTICS  ***
  12761. C
  12762. C
  12763.       INTEGER N, P, NEX
  12764.       LOGICAL RSTART
  12765. C/6
  12766.       REAL TITLE1, TITLE2
  12767. C/7
  12768. C     CHARACTER*4 TITLE1, TITLE2
  12769. C/
  12770. C
  12771.       COMMON /TESTCM/ V, RS, JAC, NOUT, NPROB, XSCAL1, XSCAL2, IS, IV
  12772.       COMMON /TESTCH/ NAME, IRC
  12773.       INTEGER IS(6,50), IV(80), JAC, NOUT, NPROB, XSCAL1, XSCAL2
  12774.       REAL RS(5,50)
  12775. C/6
  12776.       INTEGER IRC(50)
  12777.       REAL NAME(2,50)
  12778. C/7
  12779. C     CHARACTER NAME(2,50)*4, IRC(50)*1
  12780. C/
  12781.       DOUBLE PRECISION V(1736)
  12782. C
  12783.       LOGICAL RSTRT
  12784.       INTEGER I, IRUN, PU, UIP(1)
  12785. C/6
  12786.       INTEGER ALG(2), JTYP(2), RC(10)
  12787.       REAL DATIME(4)
  12788. C/7
  12789. C     CHARACTER*4 DATIME(4)
  12790. C     CHARACTER*2 ALG(2)
  12791. C     CHARACTER*1 JTYP(2), RC(10)
  12792. C/
  12793.       DOUBLE PRECISION ONE, T, URPARM(1), X(20), X0SCAL, ZERO
  12794. C
  12795. C     ***  EXTERNAL FUNCTIONS AND SUBROUTINES  ***
  12796. C
  12797.       EXTERNAL NL2SNO, NL2SOL, TESTR, TESTJ, TODAY, XINIT
  12798. C
  12799. C  ***  IV AND V SUBSCRIPTS  ***
  12800. C
  12801.       INTEGER F, F0, NFCALL, NFCOV, NGCALL, NITER, NREDUC, PREDUC,
  12802.      1        PRUNIT, RELDX
  12803. C
  12804. C/6
  12805.       DATA F/10/, F0/13/, NFCALL/6/, NFCOV/40/, NGCALL/30/,
  12806.      1     NGCOV/41/, NITER/31/, NREDUC/6/, PREDUC/7/,
  12807.      2     PRUNIT/21/, RELDX/17/
  12808. C/7
  12809. C     PARAMETER (F=10, F0=13, NFCALL=6, NFCOV=40, NGCALL=30,
  12810. C    1     NGCOV=41, NITER=31, NREDUC=6, PREDUC=7,
  12811. C    2     PRUNIT=21, RELDX=17)
  12812. C/
  12813. C/6
  12814.       DATA ONE/1.D+0/, ZERO/0.D+0/
  12815. C/7
  12816. C     PARAMETER (ONE=1.D+0, ZERO=0.D+0)
  12817. C/
  12818. C/6
  12819.       DATA ALG(1),ALG(2)/2HOL,2HNO/, JTYP(1),JTYP(2)/1H ,1H*/
  12820.       DATA RC(1)/1H./, RC(2)/1H+/, RC(3)/1HX/, RC(4)/1HR/, RC(5)/1HB/,
  12821.      1     RC(6)/1HA/, RC(7)/1HS/, RC(8)/1HF/, RC(9)/1HE/, RC(10)/1HI/
  12822. C/7
  12823. C     DATA ALG(1),ALG(2)/'OL','NO'/, JTYP(1),JTYP(2)/' ','*'/
  12824. C     DATA RC(1)/'.'/, RC(2)/'+'/, RC(3)/'X'/, RC(4)/'R'/, RC(5)/'B'/,
  12825. C    1     RC(6)/'A'/, RC(7)/'S'/, RC(8)/'F'/, RC(9)/'E'/, RC(10)/'I'/
  12826. C/
  12827. C
  12828. C-----------------------------------------------------------------------
  12829. C
  12830.       UIP(1) = NEX
  12831.       RSTRT = RSTART
  12832.       IF (RSTRT) GO TO 20
  12833.          PU = IV(PRUNIT)
  12834.          CALL TODAY(DATIME)
  12835.          IF (PU .NE. 0) WRITE(PU,10) ALG(JAC), TITLE1, TITLE2, DATIME
  12836.  10      FORMAT (1H1//11H ***** NL2S,A2,12H ON PROBLEM ,2A4,6H *****,6X,
  12837.      1           2A4,2X,2A4)
  12838. C
  12839.  20   DO 100 IRUN = XSCAL1, XSCAL2
  12840.          IF (RSTRT) GO TO 40
  12841.          IV(1) = 12
  12842.          X0SCAL = 1.0D1 ** (IRUN-1)
  12843. C
  12844. C        ***  INITIALIZE THE SOLUTION VECTOR X  ***
  12845.          CALL XINIT(P, X, NEX)
  12846.          DO 30 I = 1, P
  12847.  30           X(I) = X0SCAL * X(I)
  12848. C
  12849.  40      IF (JAC .EQ. 1)
  12850.      1             CALL NL2SOL(N,P,X,TESTR,TESTJ,IV,V,UIP,URPARM,TESTR)
  12851.          IF (JAC .EQ. 2)
  12852.      1             CALL NL2SNO(N,P,X,TESTR,IV,V,UIP,URPARM,TESTR)
  12853.          IF (.NOT. RSTRT .AND. NPROB .LT. 50) NPROB = NPROB + 1
  12854.          NAME(1,NPROB) = TITLE1
  12855.          NAME(2,NPROB) = TITLE2
  12856.          IS(1,NPROB) = N
  12857.          IS(2,NPROB) = P
  12858.          IS(3,NPROB) = IV(NITER)
  12859.          IS(4,NPROB) = IV(NFCALL) - IV(NFCOV)
  12860.          IS(5,NPROB) = IV(NGCALL) - IV(NGCOV)
  12861.          I = IV(1)
  12862.          IRC(NPROB) = RC(I)
  12863.          IS(6,NPROB) = JAC
  12864.          RS(1,NPROB) = X0SCAL
  12865.          RS(2,NPROB) = V(F)
  12866.          T = ONE
  12867.          IF (V(F0) .GT. ZERO) T = V(PREDUC) / V(F0)
  12868.          RS(3,NPROB) = T
  12869.          T = ONE
  12870.          IF (V(F0) .GT. ZERO) T = V(NREDUC) / V(F0)
  12871.          RS(4,NPROB) = T
  12872.          RS(5,NPROB) = V(RELDX)
  12873.          RSTRT = .FALSE.
  12874.          IF (NOUT .EQ. 0) GO TO 100
  12875.          IF (NPROB .EQ. 1) WRITE(NOUT,50) DATIME
  12876.  50      FORMAT(1H1,11X,2A4,2X,2A4,10X,24HNL2SOL TEST SUMMARY.....,10X,
  12877.      1          32H(* = FINITE-DIFFERENCE JACOBIAN)/
  12878.      2          48H0 PROBLEM    N   P  NITER   NF   NG  IV1  X0SCAL,5X,
  12879.      3          39HFINAL F     PRELDF     NRELDF     RELDX/)
  12880.          WRITE(NOUT,60) JTYP(JAC), TITLE1, TITLE2,
  12881.      1                (IS(I,NPROB),I=1,5),IRC(NPROB),(RS(I,NPROB),I=1,5)
  12882.  60      FORMAT(1X,A1,2A4,2I4,I7,2I5,3X,A1,F9.1,E13.3,3E11.3)
  12883.  100     CONTINUE
  12884. C
  12885.  999  RETURN
  12886. C  ***  LAST CARD OF NLTEST FOLLOWS  ***
  12887.       END
  12888.       SUBROUTINE TESTJ(N, P, X, NFCALL, J, UIPARM, URPARM, UFPARM)      TSJ00010
  12889. C
  12890. C  ***  PARAMETERS  ***
  12891. C
  12892.       INTEGER N, P, NFCALL, UIPARM(1)
  12893.       DOUBLE PRECISION X(P), J(N,P), URPARM(1)
  12894.       EXTERNAL UFPARM
  12895. C
  12896. C     ..................................................................
  12897. C     ..................................................................
  12898. C
  12899. C     *****PURPOSE.
  12900. C     THIS ROUTINE EVALUATES THE JACOBIAN MATRIX  J  FOR THE VARIOUS
  12901. C     TEST PROBLEMS LISTED IN REFERENCES (1), (2), AND (3).
  12902. C
  12903. C     *****PARAMETER DESCRIPTION.
  12904. C     ON INPUT.
  12905. C
  12906. C        NN IS THE ROW DIMENSION OF  J  AS DECLARED IN THE CALLING
  12907. C             PROGRAM.
  12908. C        N IS THE ACTUAL NUMBER OF ROWS IN  J  AND IS THE LENGTH OF  R.
  12909. C        P IS THE NUMBER OF PARAMETERS BEING ESTIMATED AND HENCE IS
  12910. C             THE LENGTH OF X.
  12911. C        X IS THE VECTOR OF PARAMETERS AT WHICH THE JACOBIAN MATRIX  J
  12912. C             IS TO BE COMPUTED.
  12913. C        NFCALL IS THE INVOCATION COUNT OF  TESTR  AT THE TIME WHEN  R
  12914. C             WAS EVALUATED AT  X.  TESTR IGNORES NFCALL.
  12915. C        R IS THE RESIDUAL VECTOR AT  X  (AND IS IGNORED).
  12916. C        NEX = UIPARM(1) IS THE INDEX OF THE PROBLEM CURRENTLY BEING
  12917. C             SOLVED.
  12918. C        URPARM IS A USER PARAMETER VECTOR (AND IS IGNORED).
  12919. C        UFPARM IS A USER ENTRY POINT PARAMETER (AND IS IGNORED).
  12920. C        TESTR IS THE SUBROUTINE THAT COMPUTES  R  (AND IS IGNORED).
  12921. C
  12922. C     ON OUTPUT.
  12923. C
  12924. C        J IS THE JACOBIAN MATRIX AT X.
  12925. C
  12926. C     *****APPLICATION AND USAGE RESTRICTIONS.
  12927. C     THESE TEST PROBLEMS MAY BE USED TO TEST LEAST-SQUARES SOLVERS
  12928. C     SUCH AS NL2SOL.  IN PARTICULAR, THESE PROBLEMS MAY BE USED TO
  12929. C     CHECK WHETHER  NL2SOL  HAS BEEN SUCCESSFULLY TRANSPORTED TO
  12930. C     A PARTICULAR MACHINE.
  12931. C
  12932. C     *****ALGORITHM NOTES.
  12933. C     NONE
  12934. C
  12935. C     *****SUBROUTINES AND FUNCTIONS CALLED.
  12936. C     NONE
  12937. C
  12938. C     *****REFERENCES
  12939. C     (1) GILL, P.E.; & MURRAY, W. (1976), ALGORITHMS FOR THE SOLUTION
  12940. C        OF THE NON-LINEAR LEAST-SQUARES PROBLEM, NPL REPORT NAC71.
  12941. C
  12942. C     (2) MEYER, R.R. (1970), THEORETICAL AND COMPUTATIONAL ASPECTS
  12943. C        OF NONLINEAR REGRESSION, PP. 465-486 OF NONLINEAR PROGRAMMING,
  12944. C        EDITED BY J.B. ROSEN, O.L.MANGASARIAN, AND K. RITTER,
  12945. C        ACADEMIC PRESS, NEW YORK.
  12946. C
  12947. C     (3) BROWN, K.M. (1969), A QUADRATICALLY CONVERGENT NEWTON-
  12948. C        LIKE METHOD BASED UPON GAUSSIAN ELIMINATION,
  12949. C        SIAM J. NUMER. ANAL. 6, PP. 560-569.
  12950. C
  12951. C     *****GENERAL.
  12952. C
  12953. C     THIS SUBROUTINE WAS WRITTEN IN CONNECTION WITH RESEARCH
  12954. C     SUPPORTED BY THE NATIONAL SCIENCE FOUNDATION UNDER GRANTS
  12955. C     MCS-7600324, DCR75-10143, 76-14311DSS, AND MCS76-11989.
  12956. C
  12957. C     ..................................................................
  12958. C     ..................................................................
  12959. C
  12960. C  ***  LOCAL VARIABLES AND CONSTANTS  ***
  12961. C
  12962.       DOUBLE PRECISION E, EXPMIN, R2, T, THETA, TI, TIM1, TIP1, TPI,
  12963.      1   TPIM1, TPIP1, TWOPI, U, UFTOLG, UKOW(11), V, W, Z, ZERO
  12964.       INTEGER I, K, NEX, NM1
  12965. C  ***  INTRINSIC FUNCTIONS  ***
  12966. C/+
  12967.       REAL FLOAT
  12968.       DOUBLE PRECISION DBLE, DCOS, DEXP, DLOG, DMIN1, DSIN, DSQRT
  12969. C/
  12970.       EXTERNAL RMDCON
  12971.       DOUBLE PRECISION DFLOAT, RMDCON
  12972. C
  12973. C/6
  12974. C/6                                                                    T
  12975.       DATA TWOPI/6.283185307179586D+0/, ZERO/0.D+0/
  12976. C/7
  12977. C     PARAMETER (TWOPI=6.283185307179586D+0, ZERO=0.D+0)
  12978. C/
  12979. C/6
  12980. C/7
  12981. C     SAVE EXPMIN, UFTOLG
  12982. C/
  12983.       DATA UKOW(1)/4.0D0/, UKOW(2)/2.0D0/, UKOW(3)/1.0D0/,
  12984.      1   UKOW(4)/5.0D-1/, UKOW(5)/2.5D-1/, UKOW(6)/1.67D-1/,
  12985.      2   UKOW(7)/1.25D-1/, UKOW(8)/1.0D-1/, UKOW(9)/8.33D-2/,
  12986.      3   UKOW(10)/7.14D-2/, UKOW(11)/6.25D-2/
  12987. C  ***  MACHINE DEPENDENT CONSTANT  ***
  12988.       DATA EXPMIN/0.0D0/, UFTOLG/0.D0/
  12989. C
  12990.       DFLOAT(II) = DBLE(FLOAT(II))
  12991. C
  12992. C-----------------------------------------------------------------------
  12993. C
  12994.       NEX = UIPARM(1)
  12995.       GO TO (100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1100,
  12996.      1   1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2100,
  12997.      2   2200, 2300, 2400, 2500, 2600, 2700, 2800, 2900, 1900, 2100,
  12998.      3   2500, 1300, 1400, 1500, 1600), NEX
  12999. C
  13000. C  ***  ROSENBROCK  ***
  13001.  100  J(1,1) = -2.0D1*X(1)
  13002.       J(1,2) = 1.0D1
  13003.       J(2,1) = -1.0D0
  13004.       J(2,2) = 0.0D0
  13005.       GO TO 9999
  13006. C  ***  HELIX  ***
  13007.  200  T = X(1)**2 + X(2)**2
  13008.       TI = 1.D2/(TWOPI*T)
  13009.       J(1,1) = TI*X(2)
  13010.       T = 1.D1/DSQRT(T)
  13011.       J(2,1) = X(1)*T
  13012.       J(3,1) = 0.D0
  13013.       J(1,2) = -TI*X(1)
  13014.       J(2,2) = X(2)*T
  13015.       J(3,2) = 0.D0
  13016.       J(1,3) = 1.D1
  13017.       J(2,3) = 0.D0
  13018.       J(3,3) = 1.D0
  13019.       GO TO 9999
  13020. C  ***  SINGULAR  ***
  13021.  300  DO 301 K = 1,4
  13022.          DO 301 I = 1,4
  13023.  301          J(I,K) = 0.D0
  13024.       J(1,1) = 1.D0
  13025.       J(1,2) = 1.D1
  13026.       J(2,3) = DSQRT(5.D0)
  13027.       J(2,4) = -J(2,3)
  13028.       J(3,2) = 2.D0*(X(2) - 2.D0*X(3))
  13029.       J(3,3) = -2.D0*J(3,2)
  13030.       J(4,1) = DSQRT(4.D1)*(X(1) - X(4))
  13031.       J(4,4) = -J(4,1)
  13032.       GO TO 9999
  13033. C  ***  WOODS  ***
  13034.  400  DO 401 K = 1,4
  13035.          DO 401 I = 1,7
  13036.  401            J(I,K) = 0.D0
  13037.       J(1,1) = -2.D1*X(1)
  13038.       J(1,2) = 1.D1
  13039.       J(2,1) = -1.D0
  13040.       J(3,4) = DSQRT(9.D1)
  13041.       J(3,3) = -2.D0*X(3)*J(3,4)
  13042.       J(4,3) = -1.D0
  13043.       J(5,2) = DSQRT(9.9D0)
  13044.       J(5,4) = J(5,2)
  13045.       J(6,2) = DSQRT(0.2D0)
  13046.       J(7,4) = J(6,2)
  13047.       GO TO 9999
  13048. C  ***  ZANGWILL  ***
  13049.  500  DO 501 K = 1,3
  13050.          DO 501 I = 1,3
  13051.  501            J(I,K) = 1.D0
  13052.       J(1,2) = -1.D0
  13053.       J(2,1) = -1.D0
  13054.       J(3,3) = -1.D0
  13055.       GO TO 9999
  13056. C  ***  ENGVALL  ***
  13057.  600  J(1,1) = 2.D0*X(1)
  13058.       J(1,2) = 2.D0*X(2)
  13059.       J(1,3) = 2.D0*X(3)
  13060.       J(2,1) = J(1,1)
  13061.       J(2,2) = J(1,2)
  13062.       J(2,3) = 2.D0*(X(3) - 2.D0)
  13063.       J(3,1) = 1.D0
  13064.       J(3,2) = 1.D0
  13065.       J(3,3) = 1.D0
  13066.       J(4,1) = 1.D0
  13067.       J(4,2) = 1.D0
  13068.       J(4,3) = -1.D0
  13069.       T = 2.D0*(5.D0*X(3) - X(1) + 1.D0)
  13070.       J(5,1) = 3.D0*X(1)**2 - T
  13071.       J(5,2) = 6.D0*X(2)
  13072.       J(5,3) = 5.D0*T
  13073.       GO TO 9999
  13074. C  ***  BRANIN  ***
  13075.  700  J(1,1) = 4.D0
  13076.       J(1,2) = 4.D0
  13077.       J(2,1) = 3.D0 + (X(1) - 2.D0)*(3.D0*X(1) - 2.D0*X(2) - 2.D0) +
  13078.      1   X(2)*X(2)
  13079.       J(2,2) = 1.D0 + 2.D0*(2.D0*X(1) - X(2)*X(2)) - (X(1) - X(2))**2
  13080.       GO TO 9999
  13081. C  ***  BEALE  ***
  13082.  800  J(1,1) = X(2) - 1.D0
  13083.       J(1,2) = X(1)
  13084.       J(2,1) = X(2)**2 - 1.D0
  13085.       J(2,2) = 2.D0*X(1)*X(2)
  13086.       J(3,1) = X(2)**3 - 1.D0
  13087.       J(3,2) = 3.D0*X(1)*(X(2)**2)
  13088.       GO TO 9999
  13089. C  ***  CRAGG & LEVY  ***
  13090.  900  DO 901 I = 1,5
  13091.          DO 901 K = 1,4
  13092.  901          J(I,K) = 0.D0
  13093.       T = DEXP(X(1))
  13094.       J(1,2) = -2.D0*(T - X(2))
  13095.       J(1,1) = -T * J(1,2)
  13096.       J(2,2) = 3.0D1*(X(2) - X(3))**2
  13097.       J(2,3) = -J(2,2)
  13098.       J(3,3) = 2.D0*DSIN(X(3) - X(4))/(DCOS(X(3) - X(4)))**3
  13099.       J(3,4) = -J(3,3)
  13100.       J(4,1) = 4.D0*X(1)**3
  13101.       J(5,4) = 1.D0
  13102.       GO TO 9999
  13103. C  ***  BOX  ***
  13104.  1000 IF (EXPMIN .EQ. ZERO) EXPMIN = 1.999D0*DLOG(RMDCON(2))
  13105.       DO 1001 I = 1,10
  13106.          TI = -0.1D0*DFLOAT(I)
  13107.          E = ZERO
  13108.          T = X(1)*TI
  13109.          IF (T .GE. EXPMIN) E = DEXP(T)
  13110.          J(I,1) = TI*E
  13111.          E = ZERO
  13112.          T = X(2)*TI
  13113.          IF (T .GE. EXPMIN) E = DEXP(T)
  13114.          J(I,2) = -TI*E
  13115.          J(I,3) = DEXP(1.D1*TI) - DEXP(TI)
  13116.  1001    CONTINUE
  13117.       GO TO 9999
  13118. C  ***  DAVIDON 1  ***
  13119.  1100 NM1 = N-1
  13120.       DO 1101 I = 1,NM1
  13121.          TI = DFLOAT(I)
  13122.          T = 1.D0
  13123.          DO 1101 K = 1,P
  13124.               J(I,K) = T
  13125.               T = T*TI
  13126.  1101         CONTINUE
  13127.       J(N,1) = 1.D0
  13128.       DO 1102 K = 2,P
  13129.  1102    J(N,K) = 0.D0
  13130.       GO TO 9999
  13131. C  ***  FREUDENSTEIN & ROTH  ***
  13132.  1200 J(1,1) = 1.D0
  13133.       J(1,2) = -2.D0 + X(2)*(1.D1 - 3.D0*X(2))
  13134.       J(2,1) = 1.D0
  13135.       J(2,2) = -1.4D1 + X(2)*(2.D0 + 3.D0*X(2))
  13136.       GO TO 9999
  13137. C  ***  WATSON  ***
  13138.  1300 CONTINUE
  13139.  1400 CONTINUE
  13140.  1500 CONTINUE
  13141.  1600 DO 1603 I = 1,29
  13142.          TI = DFLOAT(I)/2.9D1
  13143.          R2 = X(1)
  13144.          T= 1.D0
  13145.          DO 1601 K = 2,P
  13146.               T = T*TI
  13147.               R2 = R2 + T*X(K)
  13148.  1601    CONTINUE
  13149.          R2 = -2.D0*R2
  13150.          J(I,1) = R2
  13151.          T = 1.D0
  13152.          R2 = TI*R2
  13153.          DO 1602 K = 2,P
  13154.               J(I,K) = T*(DFLOAT(K-1) + R2)
  13155.               T = T*TI
  13156.  1602    CONTINUE
  13157.  1603 CONTINUE
  13158.       DO 1604 I = 30,31
  13159.          DO 1604 K = 2,P
  13160.  1604         J(I,K) = 0.D0
  13161.       J(30,1) = 1.D0
  13162.       J(31,1) = -2.D0*X(1)
  13163.       J(31,2) = 1.D0
  13164.       GO TO 9999
  13165. C  ***  CHEBYQUAD  ***
  13166.  1700 DO 1701 K = 1,N
  13167.          TIM1 = -1.D0/DFLOAT(N)
  13168.          Z = 2.D0*X(K) - 1.D0
  13169.          TI = Z*TIM1
  13170.          TPIM1 = 0.D0
  13171.          TPI = 2.D0*TIM1
  13172.          Z = Z + Z
  13173.          DO 1701 I = 1,N
  13174.               J(I,K) = TPI
  13175.               TPIP1 = 4.D0*TI + Z*TPI - TPIM1
  13176.               TPIM1 = TPI
  13177.               TPI = TPIP1
  13178.               TIP1 = Z*TI - TIM1
  13179.               TIM1 = TI
  13180.               TI = TIP1
  13181.  1701         CONTINUE
  13182.       GO TO 9999
  13183. C  ***  BROWN AND DENNIS  ***
  13184.  1800 DO 1801 I = 1, N
  13185.          TI = 0.2D0*DFLOAT(I)
  13186.          J(I,1) = 2.0D0*(X(1) + X(2)*TI - DEXP(TI))
  13187.          J(I,2) = TI*J(I,1)
  13188.          T = DSIN(TI)
  13189.          J(I,3) = 2.0D0*(X(3) + X(4)*T - DCOS(TI))
  13190.          J(I,4) = T*J(I,3)
  13191.  1801    CONTINUE
  13192.       GO TO 9999
  13193. C  ***  BARD  ***
  13194.  1900 DO 1901 I = 1,15
  13195.          J(I,1) = -1.D0
  13196.          U = DFLOAT(I)
  13197.          V = 1.6D1 - U
  13198.          W = DMIN1 (U,V)
  13199.          T = U/(X(2)*V + X(3)*W)**2
  13200.          J(I,2) = V*T
  13201.          J(I,3) = W*T
  13202.  1901 CONTINUE
  13203.       GO TO 9999
  13204. C  *** JENNRICH & SAMPSON  ***
  13205.  2000 DO 2001 I = 1,10
  13206.          TI = DFLOAT(I)
  13207.          J(I,1) = -TI*DEXP(TI*X(1))
  13208.          J(I,2) = -TI*DEXP(TI*X(2))
  13209.  2001    CONTINUE
  13210.       GO TO 9999
  13211. C  ***  KOWALIK & OSBORNE  ***
  13212.  2100 DO 2101 I = 1,11
  13213.          T = -1.D0/(UKOW(I)**2 + X(3)*UKOW(I) + X(4))
  13214.          J(I,1) = T*(UKOW(I)**2 + X(2)*UKOW(I))
  13215.          J(I,2) = X(1)*UKOW(I)*T
  13216.          T = T*J(I,1)*X(1)
  13217.          J(I,3) = UKOW(I)*T
  13218.          J(I,4) = T
  13219.  2101 CONTINUE
  13220.       GO TO 9999
  13221. C  ***  OSBORNE 1  ***
  13222.  2200 DO 2201 I = 1,33
  13223.          TI = 1.0D1*DFLOAT(1-I)
  13224.          J(I,1) = -1.D0
  13225.          J(I,2) = -DEXP(X(4)*TI)
  13226.          J(I,3) = -DEXP(X(5)*TI)
  13227.          J(I,4) = TI*X(2)*J(I,2)
  13228.          J(I,5) = TI*X(3)*J(I,3)
  13229.  2201    CONTINUE
  13230.       GO TO 9999
  13231. C  ***  OSBORNE 2  ***
  13232. C     ***  UFTOLG IS A MACHINE-DEPENDENT CONSTANT.  IT IS JUST SLIGHTLY
  13233. C     ***  LARGER THAN THE LOG OF THE SMALLEST POSITIVE MACHINE NUMBER.
  13234.  2300 IF (UFTOLG .EQ. 0.D0) UFTOLG = 1.999D0 * DLOG(RMDCON(2))
  13235.       DO 2302 I = 1,65
  13236.          TI = DFLOAT(1 - I)*1.D-1
  13237.          J(I,1) = -DEXP(X(5)*TI)
  13238.          J(I,5) = X(1)*TI*J(I,1)
  13239.          DO 2301 K = 2,4
  13240.               T = X(K + 7) + TI
  13241.               R2 = 0.D0
  13242.               THETA = -X(K+4)*T*T
  13243.               IF (THETA .GT. UFTOLG) R2 = -DEXP(THETA)
  13244.               J(I,K) = R2
  13245.               R2 = -T*R2*X(K)
  13246.               J(I,K+4) = R2*T
  13247.               J(I,K+7) = 2.D0*X(K+4)*R2
  13248.  2301         CONTINUE
  13249.  2302    CONTINUE
  13250.       GO TO 9999
  13251. C  ***  MADSEN  ***
  13252.  2400 J(1,1) = 2.D0*X(1) + X(2)
  13253.       J(1,2) = 2.D0*X(2) + X(1)
  13254.       J(2,1) = DCOS(X(1))
  13255.       J(2,2) = 0.D0
  13256.       J(3,1) = 0.D0
  13257.       J(3,2) = -DSIN(X(2))
  13258.       GO TO 9999
  13259. C  ***  MEYER  ***
  13260.  2500 DO 2501 I = 1, 16
  13261.          TI = DFLOAT(5*I + 45)
  13262.          U = TI + X(3)
  13263.          T = DEXP(X(2)/U)
  13264.          J(I,1) = T
  13265.          J(I,2) = X(1)*T/U
  13266.          J(I,3) = -X(1)*X(2)*T/(U*U)
  13267.  2501    CONTINUE
  13268.       GO TO 9999
  13269. C  ***  BROWN  ***
  13270.  2600 CONTINUE
  13271.  2700 CONTINUE
  13272.  2800 CONTINUE
  13273.  2900 NM1 = N - 1
  13274.       DO 2901 K = 1, N
  13275.          DO 2901 I = 1, NM1
  13276.               J(I,K) = 1.0D0
  13277.               IF (I .EQ. K) J(I,K) = 2.0D0
  13278.  2901         CONTINUE
  13279.       DO 2903 K = 1, N
  13280.          T = 1.0D0
  13281.          DO 2902 I = 1,N
  13282.               IF (I .NE. K) T = T*X(I)
  13283.  2902         CONTINUE
  13284.          J(N,K) = T
  13285.  2903    CONTINUE
  13286.       GO TO 9999
  13287. C
  13288. C
  13289.  9999 RETURN
  13290.       END
  13291.       SUBROUTINE TESTR(N, P, X, NFCALL, R, UIPARM, URPARM, UFPARM)      TES00010
  13292. C
  13293. C     *****PARAMETERS.
  13294. C
  13295.       INTEGER N, P, NFCALL, UIPARM(1)
  13296.       DOUBLE PRECISION X(P), R(N), URPARM(1)
  13297.       EXTERNAL UFPARM
  13298. C
  13299. C     ..................................................................
  13300. C     ..................................................................
  13301. C
  13302. C     *****PURPOSE.
  13303. C     THIS ROUTINE EVALUATES  R  FOR THE VARIOUS TEST FUNCTIONS IN
  13304. C        REFERENCES (1), (2), AND (3), AS WELL AS FOR SOME VARIATIONS
  13305. C        SUGGESTED BY JORGE MORE (PRIVATE COMMUNICATION) ON SOME OF
  13306. C        THESE TEST PROBLEMS (FOR NEX .GE. 30).
  13307. C
  13308. C     *****PARAMETER DESCRIPTION.
  13309. C     ON INPUT.
  13310. C
  13311. C        N IS THE LENGTH OF R.
  13312. C        P IS THE LENGTH OF X.
  13313. C        X IS THE POINT AT WHICH THE RESIDUAL VECTOR R IS TO BE
  13314. C             COMPUTED.
  13315. C        NFCALL IS THE INVOCATION COUNT OF TESTR.
  13316. C        NEX = UIPARM(1) IS THE INDEX OF THE PROBLEM CURRENTLY BEING
  13317. C             SOLVED.
  13318. C        URPARM IS A USER PARAMETER VECTOR (AND IS IGNORED).
  13319. C        UFPARM IS A USER ENTRY POINT PARAMETER (AND IS IGNORED).
  13320. C
  13321. C     ON OUTPUT.
  13322. C
  13323. C        R IS THE RESIDUAL VECTOR AT X.
  13324. C
  13325. C     *****APPLICATION AND USAGE RESTRICTIONS.
  13326. C     THESE TEST PROBLEMS MAY BE USED TO TEST LEAST-SQUARES SOLVERS
  13327. C     SUCH AS NL2SOL.  IN PARTICULAR, THESE PROBLEMS MAY BE USED TO
  13328. C     CHECK WHETHER  NL2SOL  HAS BEEN SUCCESSFULLY TRANSPORTED TO
  13329. C     A PARTICULAR MACHINE.
  13330. C
  13331. C     *****ALGORITHM NOTES.
  13332. C     NONE
  13333. C
  13334. C     *****SUBROUTINES AND FUNCTIONS CALLED.
  13335. C     NONE
  13336. C
  13337. C     *****REFERENCES
  13338. C     (1) GILL, P.E.. & MURRAY, W. (1976), ALGORITHMS FOR THE SOLUTION
  13339. C        OF THE NON-LINEAR LEAST-SQUARES PROBLEM, NPL REPORT NAC71.
  13340. C
  13341. C     (2) MEYER, R.R. (1970), THEORETICAL AND COMPUTATIONAL ASPECTS
  13342. C        OF NONLINEAR REGRESSION, PP. 465-486 OF NONLINEAR PROGRAMMING,
  13343. C        EDITED BY J.B. ROSEN, O.L.MANGASARIAN, AND K. RITTER,
  13344. C        ACADEMIC PRESS, NEW YORK.
  13345. C
  13346. C     (3) BROWN, K.M. (1969), A QUADRATICALLY CONVERGENT NEWTON-
  13347. C        LIKE METHOD BASED UPON GAUSSIAN ELIMINATION,
  13348. C        SIAM J. NUMER. ANAL. 6, PP. 560-569.
  13349. C
  13350. C     *****GENERAL.
  13351. C
  13352. C     THIS SUBROUTINE WAS WRITTEN IN CONNECTION WITH RESEARCH
  13353. C     SUPPORTED BY THE NATIONAL SCIENCE FOUNDATION UNDER GRANTS
  13354. C     MCS-7600324, DCR75-10143, 76-14311DSS, AND MCS76-11989.
  13355. C
  13356. C     ..................................................................
  13357. C     ..................................................................
  13358. C
  13359. C  ***  LOCAL VARIABLES AND CONSTANTS  ***
  13360. C
  13361.       DOUBLE PRECISION E1, E2, FLOATN, RI, R1, R2, T, THETA, TI, TIM1,
  13362.      1             TIP1, TWOPI, T1, T2, U, V, W, Z
  13363.       DOUBLE PRECISION YBARD(15), YKOW(11), UKOW(11), YOSB1(33),
  13364.      1             YOSB2(65), YMEYER(16)
  13365.       INTEGER I, J, NEX, NM1
  13366.       DOUBLE PRECISION EXPMAX, EXPMIN, UFTOLG
  13367. C  ***  INTRINSIC FUNCTIONS  ***
  13368. C/+
  13369.       INTEGER MOD
  13370.       REAL FLOAT
  13371.       DOUBLE PRECISION DATAN2, DBLE, DCOS, DEXP, DLOG, DMIN1, DSIN,
  13372.      1                 DSQRT
  13373. C/
  13374.       EXTERNAL RMDCON
  13375.       DOUBLE PRECISION DFLOAT, RMDCON
  13376. C/6
  13377.       DATA TWOPI/6.283185307179586D+0/
  13378. C/7
  13379. C     PARAMETER (TWOPI=6.283185307179586D+0)
  13380. C/
  13381. C/6
  13382. C/7
  13383. C     SAVE EXPMAX, EXPMIN, UFTOLG
  13384. C/
  13385.       DATA YBARD(1)/1.4D-1/, YBARD(2)/1.8D-1/, YBARD(3)/2.2D-1/,
  13386.      1   YBARD(4)/2.5D-1/, YBARD(5)/2.9D-1/, YBARD(6)/3.2D-1/,
  13387.      2   YBARD(7)/3.5D-1/, YBARD(8)/3.9D-1/, YBARD(9)/3.7D-1/,
  13388.      3   YBARD(10)/5.8D-1/, YBARD(11)/7.3D-1/, YBARD(12)/9.6D-1/,
  13389.      4   YBARD(13)/1.34D0/, YBARD(14)/2.10D0/, YBARD(15)/4.39D0/
  13390.       DATA YKOW(1)/1.957D-1/, YKOW(2)/1.947D-1/, YKOW(3)/1.735D-1/,
  13391.      1   YKOW(4)/1.600D-1/, YKOW(5)/8.44D-2/, YKOW(6)/6.27D-2/,
  13392.      2   YKOW(7)/4.56D-2/, YKOW(8)/3.42D-2/, YKOW(9)/3.23D-2/,
  13393.      3   YKOW(10)/2.35D-2/, YKOW(11)/2.46D-2/
  13394.       DATA UKOW(1)/4.0D0/, UKOW(2)/2.0D0/, UKOW(3)/1.0D0/,
  13395.      1   UKOW(4)/5.0D-1/, UKOW(5)/2.5D-1/, UKOW(6)/1.67D-1/,
  13396.      2   UKOW(7)/1.25D-1/, UKOW(8)/1.0D-1/, UKOW(9)/8.33D-2/,
  13397.      3   UKOW(10)/7.14D-2/, UKOW(11)/6.25D-2/
  13398.       DATA YOSB1(1)/8.44D-1/, YOSB1(2)/9.08D-1/, YOSB1(3)/9.32D-1/,
  13399.      1   YOSB1(4)/9.36D-1/, YOSB1(5)/9.25D-1/, YOSB1(6)/9.08D-1/,
  13400.      2   YOSB1(7)/8.81D-1/, YOSB1(8)/8.50D-1/, YOSB1(9)/8.18D-1/,
  13401.      3   YOSB1(10)/7.84D-1/, YOSB1(11)/7.51D-1/, YOSB1(12)/7.18D-1/,
  13402.      4   YOSB1(13)/6.85D-1/, YOSB1(14)/6.58D-1/, YOSB1(15)/6.28D-1/,
  13403.      5   YOSB1(16)/6.03D-1/, YOSB1(17)/5.80D-1/, YOSB1(18)/5.58D-1/,
  13404.      6   YOSB1(19)/5.38D-1/, YOSB1(20)/5.22D-1/, YOSB1(21)/5.06D-1/,
  13405.      7   YOSB1(22)/4.90D-1/, YOSB1(23)/4.78D-1/, YOSB1(24)/4.67D-1/,
  13406.      8   YOSB1(25)/4.57D-1/, YOSB1(26)/4.48D-1/, YOSB1(27)/4.38D-1/,
  13407.      9   YOSB1(28)/4.31D-1/, YOSB1(29)/4.24D-1/, YOSB1(30)/4.20D-1/,
  13408.      A   YOSB1(31)/4.14D-1/, YOSB1(32)/4.11D-1/, YOSB1(33)/4.06D-1/
  13409.       DATA YOSB2(1)/1.366D0/, YOSB2(2)/1.191D0/, YOSB2(3)/1.112D0/,
  13410.      1   YOSB2(4)/1.013D0/, YOSB2(5)/9.91D-1/, YOSB2(6)/8.85D-1/,
  13411.      2   YOSB2(7)/8.31D-1/, YOSB2(8)/8.47D-1/, YOSB2(9)/7.86D-1/,
  13412.      3   YOSB2(10)/7.25D-1/, YOSB2(11)/7.46D-1/, YOSB2(12)/6.79D-1/,
  13413.      4   YOSB2(13)/6.08D-1/, YOSB2(14)/6.55D-1/, YOSB2(15)/6.16D-1/,
  13414.      5   YOSB2(16)/6.06D-1/, YOSB2(17)/6.02D-1/, YOSB2(18)/6.26D-1/,
  13415.      6   YOSB2(19)/6.51D-1/, YOSB2(20)/7.24D-1/, YOSB2(21)/6.49D-1/,
  13416.      7   YOSB2(22)/6.49D-1/, YOSB2(23)/6.94D-1/, YOSB2(24)/6.44D-1/,
  13417.      8   YOSB2(25)/6.24D-1/, YOSB2(26)/6.61D-1/, YOSB2(27)/6.12D-1/,
  13418.      9   YOSB2(28)/5.58D-1/, YOSB2(29)/5.33D-1/, YOSB2(30)/4.95D-1/,
  13419.      A   YOSB2(31)/5.00D-1/, YOSB2(32)/4.23D-1/, YOSB2(33)/3.95D-1/,
  13420.      B   YOSB2(34)/3.75D-1/, YOSB2(35)/3.72D-1/, YOSB2(36)/3.91D-1/,
  13421.      C   YOSB2(37)/3.96D-1/, YOSB2(38)/4.05D-1/, YOSB2(39)/4.28D-1/,
  13422.      D   YOSB2(40)/4.29D-1/, YOSB2(41)/5.23D-1/, YOSB2(42)/5.62D-1/,
  13423.      E   YOSB2(43)/6.07D-1/, YOSB2(44)/6.53D-1/, YOSB2(45)/6.72D-1/,
  13424.      F   YOSB2(46)/7.08D-1/, YOSB2(47)/6.33D-1/, YOSB2(48)/6.68D-1/,
  13425.      G   YOSB2(49)/6.45D-1/, YOSB2(50)/6.32D-1/, YOSB2(51)/5.91D-1/,
  13426.      H   YOSB2(52)/5.59D-1/, YOSB2(53)/5.97D-1/, YOSB2(54)/6.25D-1/,
  13427.      I   YOSB2(55)/7.39D-1/, YOSB2(56)/7.10D-1/, YOSB2(57)/7.29D-1/,
  13428.      J   YOSB2(58)/7.20D-1/, YOSB2(59)/6.36D-1/, YOSB2(60)/5.81D-1/
  13429.       DATA YOSB2(61)/4.28D-1/, YOSB2(62)/2.92D-1/, YOSB2(63)/1.62D-1/,
  13430.      1   YOSB2(64)/9.8D-2/, YOSB2(65)/5.4D-2/
  13431.       DATA YMEYER(1)/3.478D4/, YMEYER(2)/2.861D4/, YMEYER(3)/2.365D4/,
  13432.      1   YMEYER(4)/1.963D4/, YMEYER(5)/1.637D4/, YMEYER(6)/1.372D4/,
  13433.      2   YMEYER(7)/1.154D4/, YMEYER(8)/9.744D3/, YMEYER(9)/8.261D3/,
  13434.      3   YMEYER(10)/7.030D3/, YMEYER(11)/6.005D3/, YMEYER(12)/5.147D3/,
  13435.      4   YMEYER(13)/4.427D3/, YMEYER(14)/3.820D3/, YMEYER(15)/3.307D3/,
  13436.      5   YMEYER(16)/2.872D3/
  13437. C
  13438.       DATA EXPMAX/0.D0/, UFTOLG/0.D0/
  13439. C
  13440.       DFLOAT(II) = DBLE(FLOAT(II))
  13441. C
  13442. C-----------------------------------------------------------------------
  13443. C
  13444.       NEX = UIPARM(1)
  13445.       GO TO (100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1100,
  13446.      1   1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2100,
  13447.      2   2200, 2300, 2400, 2500, 2600, 2700, 2800, 2900, 1900, 2100,
  13448.      3   2500, 1300, 1400, 1500, 1600), NEX
  13449. C
  13450. C  ***  ROSENBROCK   ***
  13451.  100  R(1) = 1.0D1*(X(2) - X(1)**2)
  13452.       R(2) = 1.0D0 - X(1)
  13453.       GO TO 9999
  13454. C  ***  HELIX   ***
  13455.  200  THETA = DATAN2(X(2), X(1))/TWOPI
  13456.       IF (X(1) .LE. 0.D0 .AND. X(2) .LE. 0.D0) THETA = THETA + 1.D0
  13457.       R(1) = 1.0D1*(X(3) - 1.0D1*THETA)
  13458.       R(2) = 1.0D1*(DSQRT(X(1)**2 + X(2)**2) - 1.0D0)
  13459.       R(3) = X(3)
  13460.       GO TO 9999
  13461. C  ***  SINGULAR   ***
  13462.  300  R(1) = X(1) + 1.0D1*X(2)
  13463.       R(2) = DSQRT(5.0D0)*(X(3) - X(4))
  13464.       R(3) = (X(2) - 2.0D0*X(3))**2
  13465.       R(4) = DSQRT(1.0D1)*(X(1) - X(4))**2
  13466.       GO TO 9999
  13467. C  ***  WOODS   ***
  13468.  400  R(1) = 1.0D1*(X(2) - X(1)**2)
  13469.       R(2) = 1.0D0 - X(1)
  13470.       R(3) = DSQRT(9.0D1)*(X(4) - X(3)**2)
  13471.       R(4) = 1.0D0 - X(3)
  13472.       R(5) = DSQRT(9.9D0)*(X(2) + X(4) - 2.D0)
  13473.       T = DSQRT(2.0D-1)
  13474.       R(6) = T*(X(2) - 1.0D0)
  13475.       R(7) = T*(X(4) - 1.0D0)
  13476.       GO TO 9999
  13477. C  ***  ZANGWILL
  13478.  500  R(1) = X(1) - X(2) + X(3)
  13479.       R(2) = -X(1) + X(2) + X(3)
  13480.       R(3) = X(1) + X(2) - X(3)
  13481.       GO TO 9999
  13482. C  ***  ENGVALL   ***
  13483.  600  R(1) = X(1)**2 + X(2)**2 + X(3)**2 - 1.0D0
  13484.       R(2) = X(1)**2 + X(2)**2 + (X(3) - 2.0D0)**2 - 1.0D0
  13485.       R(3) = X(1) + X(2) + X(3) - 1.0D0
  13486.       R(4) = X(1) + X(2) - X(3) + 1.0D0
  13487.       R(5) = X(1)**3 + 3.0D0*X(2)**2 + (5.0D0*X(3) - X(1) + 1.0D0)**2
  13488.      1               - 3.6D1
  13489.       GO TO 9999
  13490. C  ***  BRANIN ***
  13491.  700  R(1) = 4.0D0*(X(1) + X(2))
  13492.       R(2) = R(1) + (X(1) - X(2))*((X(1) - 2.0D0)**2 +
  13493.      1       X(2)**2 - 1.0D0)
  13494.       GO TO 9999
  13495. C  ***  BEALE  ***
  13496.  800  R(1) = 1.5D0 - X(1)*(1.0D0 - X(2))
  13497.       R(2) = 2.25D0 - X(1)*(1.0D0 - X(2)**2)
  13498.       R(3) = 2.625D0 - X(1)*(1.0D0 -  X(2)**3)
  13499.       GO TO 9999
  13500. C  ***  CRAGG AND LEVY  ***
  13501.  900  R(1) = (DEXP(X(1)) - X(2))**2
  13502.       R(2) = 1.0D1*(X(2) - X(3))**3
  13503.       R(3) = ( DSIN(X(3) - X(4)) / DCOS(X(3) - X(4)) )**2
  13504.       R(4) = X(1)**4
  13505.       R(5) = X(4) - 1.0D0
  13506.       GO TO 9999
  13507. C  ***  BOX  ***
  13508.  1000 IF (EXPMAX .GT. 0.D0) GO TO 1001
  13509.          EXPMAX = 1.999D0 * DLOG(RMDCON(5))
  13510.          EXPMIN = 1.999D0 * DLOG(RMDCON(2))
  13511.  1001 IF (-EXPMAX .GE. DMIN1(X(1), X(2), X(3))) GO TO 1003
  13512.       DO 1002 I = 1,10
  13513.          TI = -0.1D0*DFLOAT(I)
  13514.          T1 = TI*X(1)
  13515.          E1 = 0.D0
  13516.          IF (T1 .GT. EXPMIN) E1 = DEXP(T1)
  13517.          T2 = TI*X(2)
  13518.          E2 = 0.D0
  13519.          IF (T2 .GT. EXPMIN) E2 = DEXP(T2)
  13520.          R(I) = (E1 - E2) - X(3)*(DEXP(TI) - DEXP(1.0D1*TI))
  13521.  1002 CONTINUE
  13522.       GO TO 9999
  13523.  1003 NFCALL = -1
  13524.       GO TO 9999
  13525. C  ***  DAVIDON 1  ***
  13526.  1100 NM1 = N - 1
  13527.       DO 1102 I = 1, NM1
  13528.          R1 = 0.0D0
  13529.          TI = DFLOAT(I)
  13530.          T = 1.D0
  13531.          DO 1101 J = 1,P
  13532.               R1 = R1 + T*X(J)
  13533.               T = T*TI
  13534.  1101         CONTINUE
  13535.          R(I) = R1
  13536.  1102    CONTINUE
  13537.       R(N) = X(1) - 1.0D0
  13538.       GO TO 9999
  13539. C  ***  FREUDENSTEIN AND ROTH  ***
  13540.  1200 R(1) = -1.3D1 + X(1) - 2.0D0*X(2) + 5.0D0*X(2)**2 - X(2)**3
  13541.       R(2) = -2.9D1 + X(1) - 1.4D1*X(2) + X(2)**2 + X(2)**3
  13542.       GO TO 9999
  13543. C  ***  WATSON  ***
  13544.  1300  CONTINUE
  13545.  1400  CONTINUE
  13546.  1500  CONTINUE
  13547.  1600 DO 1602 I = 1, 29
  13548.          TI = DFLOAT(I)/2.9D1
  13549.          R1 = 0.0D0
  13550.          R2 = X(1)
  13551.          T = 1.0D0
  13552.          DO 1601 J = 2, P
  13553.               R1 = R1 + DFLOAT(J-1)*T*X(J)
  13554.               T = T*TI
  13555.               R2 = R2 + T*X(J)
  13556.  1601         CONTINUE
  13557.          R(I) = R1 - R2*R2 - 1.0D0
  13558.          IF (NEX .GE. 33 .AND. NEX .LE. 36) R(I) = R(I) + 10.D0
  13559.  1602    CONTINUE
  13560.       R(30) = X(1)
  13561.       R(31) = X(2) - X(1)**2 - 1.0D0
  13562.       IF (NEX .LT. 33 .OR. NEX .GT. 36) GO TO 9999
  13563.       R(30) = R(30) + 10.D0
  13564.       R(31) = R(31) + 10.D0
  13565.       GO TO 9999
  13566. C  ***  CHEBYQUAD  ***
  13567.  1700 DO 1701 I = 1,N
  13568.  1701    R(I) = 0.0D0
  13569.       DO 1702 J = 1,N
  13570.          TIM1 = 1.0D0
  13571.          TI = 2.0D0*X(J) - 1.0D0
  13572.          Z = TI + TI
  13573.          DO 1702 I = 1,N
  13574.               R(I) = R(I) + TI
  13575.               TIP1 = Z*TI -TIM1
  13576.               TIM1 = TI
  13577.               TI = TIP1
  13578.  1702         CONTINUE
  13579.       FLOATN = DFLOAT(N)
  13580.       DO 1703 I = 1,N
  13581.          TI = 0.0D0
  13582.          IF (MOD(I,2) .EQ. 0) TI = -1.0D0/DFLOAT(I*I - 1)
  13583.          R(I) = TI - R(I)/FLOATN
  13584.  1703    CONTINUE
  13585.       GO TO 9999
  13586. C  ***  BROWN AND DENNIS  ***
  13587.  1800  DO 1801 I = 1, N
  13588.          TI = 0.2D0*DFLOAT(I)
  13589.          R(I) = (X(1) + X(2)*TI - DEXP(TI))**2 +
  13590.      1             (X(3) + X(4)*DSIN(TI) - DCOS(TI))**2
  13591.  1801    CONTINUE
  13592.       GO TO 9999
  13593. C  ***  BARD  ***
  13594.  1900 DO 1901 I = 1, 15
  13595.          U = DFLOAT(I)
  13596.          V = 1.6D1 - U
  13597.          W = DMIN1(U,V)
  13598.          R(I) = YBARD(I) - (X(1) + U/(X(2)*V + X(3)*W))
  13599.          IF (NEX .EQ. 30) R(I) = R(I) + 10.D0
  13600.  1901    CONTINUE
  13601.       GO TO 9999
  13602. C  ***  JENNRICH AND SAMPSON  ***
  13603.  2000 DO 2001 I = 1, 10
  13604.          TI = DFLOAT(I)
  13605.          R(I) = 2.0D0 + 2.0D0*TI - (DEXP(TI*X(1)) +
  13606.      1          DEXP(TI*X(2)))
  13607.  2001    CONTINUE
  13608.       GO TO 9999
  13609. C  ***  KOWALIK AND OSBORNE  ***
  13610.  2100 DO 2101 I = 1, 11
  13611.          R(I) = YKOW(I) - X(1)*(UKOW(I)**2 + X(2)*UKOW(I))/(UKOW(I)**2 +
  13612.      1          X(3)*UKOW(I) + X(4))
  13613.          IF (NEX .EQ. 31) R(I) = R(I) + 10.D0
  13614.  2101    CONTINUE
  13615.       GO TO 9999
  13616. C  ***  OSBORNE 1  ***
  13617.  2200 DO 2201 I = 1, 33
  13618.          TI = 1.0D1*DFLOAT(1-I)
  13619.          R(I) = YOSB1(I) - (X(1) + X(2)*DEXP(X(4)*TI) +
  13620.      1          X(3)*DEXP(X(5)*TI))
  13621.  2201    CONTINUE
  13622.       GO TO 9999
  13623. C  ***  OSBORNE 2  ***
  13624. C     ***  UFTOLG IS A MACHINE-DEPENDENT CONSTANT.  IT IS JUST SLIGHTLY
  13625. C     ***  LARGER THAN THE LOG OF THE SMALLEST POSITIVE MACHINE NUMBER.
  13626.  2300 IF (UFTOLG .EQ. 0.D0) UFTOLG = 1.999D0 * DLOG(RMDCON(2))
  13627.       DO 2302 I = 1, 65
  13628.          TI = 0.1D0*DFLOAT(1-I)
  13629.          RI = X(1)*DEXP(X(5)*TI)
  13630.          DO 2301 J = 2, 4
  13631.               T = 0.D0
  13632.               THETA = -X(J+4) * (TI + X(J+7))**2
  13633.               IF (THETA .GT. UFTOLG) T = DEXP(THETA)
  13634.               RI = RI + X(J)*T
  13635.  2301         CONTINUE
  13636.          R(I) = YOSB2(I) - RI
  13637.  2302 CONTINUE
  13638.       GO TO 9999
  13639. C  ***  MADSEN  ***
  13640.  2400 R(1) = X(1)**2 + X(2)**2 + X(1)*X(2)
  13641.       R(2) = DSIN(X(1))
  13642.       R(3) = DCOS(X(2))
  13643.       GO TO 9999
  13644. C  ***  MEYER  ***
  13645.  2500 DO 2501 I = 1, 16
  13646.          TI = DFLOAT(5*I + 45)
  13647.          R(I)=X(1)*DEXP(X(2)/(TI + X(3))) - YMEYER(I)
  13648.          IF (NEX .EQ. 32) R(I) = R(I) + 10.D0
  13649.  2501    CONTINUE
  13650.       GO TO 9999
  13651. C  ***  BROWN  ***
  13652.  2600 CONTINUE
  13653.  2700 CONTINUE
  13654.  2800 CONTINUE
  13655.  2900 T = X(1) - DFLOAT(N + 1)
  13656.       DO 2901 I = 2, N
  13657.  2901    T = T + X(I)
  13658.       NM1 = N - 1
  13659.       DO 2902 I = 1, NM1
  13660.  2902    R(I) = T + X(I)
  13661.       T = X(1)
  13662.       DO 2903 I = 2, N
  13663.  2903    T = T * X(I)
  13664.       R(N) = T - 1.0D0
  13665.       GO TO 9999
  13666. C
  13667.  9999 RETURN
  13668. C     ..... LAST CARD OF TESTR .........................................
  13669.       END
  13670.       SUBROUTINE TODAY(DATIME)                                          TOD00010
  13671. C
  13672. C  ***  SUPPLY SUMSOL VERSION  ***
  13673. C
  13674. C/6
  13675.       REAL DATIME(4), DT1, DT2, DT3, DT4
  13676.       DATA DT1,DT2,DT3,DT4/4HNL2S,4HOL  ,4HVER.,4H2.2 /
  13677. C/7
  13678. C     CHARACTER*4 DATIME(4), DT1, DT2, DT3, DT4
  13679. C     DATA DT1,DT2,DT3,DT4/'NL2S','OL  ','VER.','2.2 '/
  13680. C/
  13681. C
  13682.       DATIME(1) = DT1
  13683.       DATIME(2) = DT2
  13684.       DATIME(3) = DT3
  13685.       DATIME(4) = DT4
  13686.  999  RETURN
  13687. C  ***  LAST LINE OF DATIME FOLLOWS  ***
  13688.       END
  13689.       SUBROUTINE XINIT(P, X, NEX)                                       XIN00010
  13690. C
  13691. C     *****PARAMETERS...
  13692. C
  13693.       INTEGER NEX, P
  13694.       DOUBLE PRECISION X(P)
  13695. C
  13696. C     ..................................................................
  13697. C
  13698. C     *****PURPOSE...
  13699. C     THIS ROUTINE INITIALIZES THE SOLUTION VECTOR X ACCORDING TO
  13700. C     THE INITIAL VALUES FOR THE VARIOUS TEST FUNCTIONS GIVEN IN
  13701. C     REFERENCES (1), (2), AND (3).
  13702. C     SUBROUTINES TESTR AND TESTJ.  (SEE TESTR FOR REFERENCES.)
  13703. C
  13704. C     *****PARAMETER DESCRIPTION...
  13705. C     ON INPUT...
  13706. C
  13707. C        NEX IS THE TEST PROBLEM NUMBER.
  13708. C
  13709. C        P IS THE NUMBER OF PARAMETERS.
  13710. C
  13711. C     ON OUTPUT...
  13712. C
  13713. C        X IS THE INITIAL GUESS TO THE SOLUTION.
  13714. C
  13715. C     *****APPLICATION AND USAGE RESTRICTIONS...
  13716. C     THIS ROUTINE IS CALLED BY NLTEST.
  13717. C
  13718. C     ..................................................................
  13719. C
  13720. C     *****LOCAL VARIABLES...
  13721.       INTEGER I
  13722.       DOUBLE PRECISION PP1INV
  13723. C     *****INTRINSIC FUNCTIONS...
  13724. C/+
  13725.       REAL FLOAT
  13726.       DOUBLE PRECISION DBLE
  13727. C/
  13728.       DFLOAT(II) = DBLE(FLOAT(II))
  13729. C
  13730.       GO TO (100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1100,
  13731.      1   1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2100,
  13732.      2   2200, 2300, 2400, 2500, 2600, 2700, 2800, 2900, 1900, 2100,
  13733.      3   2500, 1300, 1400, 1500, 1600),NEX
  13734. C
  13735. C  ***  ROSENBROCK  ***
  13736.  100  X(1) = -1.2D0
  13737.       X(2) = 1.0D0
  13738.       GO TO 9999
  13739. C  ***  HELIX  ***
  13740.  200  X(1) = -1.0D0
  13741.       X(2) = 0.0D0
  13742.       X(3) = 0.0D0
  13743.       GO TO 9999
  13744. C  *** SINGULAR  ***
  13745.  300  X(1) = 3.0D0
  13746.       X(2) = -1.0D0
  13747.       X(3) = 0.0D0
  13748.       X(4) = 1.0D0
  13749.       GO TO 9999
  13750. C  ***  WOODS  ***
  13751.  400  X(1) = -3.0D0
  13752.       X(2) = -1.0D0
  13753.       X(3) = -3.0D0
  13754.       X(4) = -1.0D0
  13755.       GO TO 9999
  13756. C  ***  ZANGWILL  ***
  13757.  500  X(1) = 1.0D2
  13758.       X(2) = -1.0D0
  13759.       X(3) = 2.5D0
  13760.       GO TO 9999
  13761. C  ***  ENGVALL  ***
  13762.  600  X(1) = 1.0D0
  13763.       X(2) = 2.0D0
  13764.       X(3) = 0.0D0
  13765.       GO TO 9999
  13766. C  *** BRANIN  ***
  13767.  700  X(1) = 2.0D0
  13768.       X(2) = 0.0D0
  13769.       GO TO 9999
  13770. C  ***  BEALE  ***
  13771.  800  X(1) = 1.0D-1
  13772.       X(2) = 1.0D-1
  13773.       GO TO 9999
  13774. C  *** CRAGG AND LEVY  ***
  13775.  900  X(1) = 1.0D0
  13776.       X(2) = 2.0D0
  13777.       X(3) = 2.0D0
  13778.       X(4) = 2.0D0
  13779.       GO TO 9999
  13780. C  ***  BOX  ***
  13781.  1000 X(1) = 0.0D0
  13782.       X(2) = 1.0D1
  13783.       X(3) = 2.0D1
  13784.       GO TO 9999
  13785. C  ***  DAVIDON 1  ***
  13786.  1100 DO 1101 I = 1,P
  13787.  1101    X(I) = 0.0D0
  13788.       GO TO 9999
  13789. C  ***  FREUDENSTEIN AND ROTH  ***
  13790.  1200 X(1) = 1.5D1
  13791.       X(2) = -2.0D0
  13792.       GO TO 9999
  13793. C  ***  WATSON  ***
  13794.  1300 CONTINUE
  13795.  1400 CONTINUE
  13796.  1500 CONTINUE
  13797.  1600 DO 1601 I = 1,P
  13798.  1601    X(I) = 0.0D0
  13799.       GO TO 9999
  13800. C  ***  CHEBYQUAD  ***
  13801.  1700 PP1INV = 1.0D0/DFLOAT(P + 1)
  13802.       DO 1701 I = 1, P
  13803.  1701    X(I) = DFLOAT(I)*PP1INV
  13804.       GO TO 9999
  13805. C  *** BROWN AND DENNIS  ***
  13806.  1800 X(1) = 2.5D1
  13807.       X(2) = 5.0D0
  13808.       X(3) = -5.0D0
  13809.       X(4) = -1.0D0
  13810.       GO TO 9999
  13811. C  ***  BARD  ***
  13812.  1900 X(1) = 1.D0
  13813.       X(2) = 1.D0
  13814.       X(3) = 1.D0
  13815.       GO TO 9999
  13816. C  ***  JENNRICH AND SAMPSON  ***
  13817.  2000 X(1) = 3.0D-1
  13818.       X(2) = 4.0D-1
  13819.       GO TO 9999
  13820. C  ***  KOWALIK AND OSBORNE  ***
  13821.  2100 X(1) = 2.5D-1
  13822.       X(2) = 3.9D-1
  13823.       X(3) = 4.15D-1
  13824.       X(4) = 3.9D-1
  13825.       GO TO 9999
  13826. C  ***  OSBORNE 1  ***
  13827.  2200 X(1) = 5.0D-1
  13828.       X(2) = 1.5D0
  13829.       X(3) = -1.0D0
  13830.       X(4) = 1.0D-2
  13831.       X(5) = 2.0D-2
  13832.       GO TO 9999
  13833. C  ***  OSBORNE 2  ***
  13834.  2300 X(1) = 1.3D0
  13835.       X(2) = 6.5D-1
  13836.       X(3) = 6.5D-1
  13837.       X(4) = 7.0D-1
  13838.       X(5) = 6.0D-1
  13839.       X(6) = 3.0D0
  13840.       X(7) = 5.0D0
  13841.       X(8) = 7.0D0
  13842.       X(9) = 2.0D0
  13843.       X(10) = 4.5D0
  13844.       X(11) = 5.5D0
  13845.       GO TO 9999
  13846. C  ***  MADSEN  ***
  13847.  2400 X(1) = 3.0D0
  13848.       X(2) = 1.0D0
  13849.       GO TO 9999
  13850. C  ***  MEYER  **
  13851.  2500 X(1) = 2.0D-2
  13852.       X(2) = 4.0D3
  13853.       X(3) = 2.5D2
  13854.       GO TO 9999
  13855. C  ***  BROWN  ***
  13856.  2600 CONTINUE
  13857.  2700 CONTINUE
  13858.  2800 CONTINUE
  13859.  2900 DO 2901 I = 1, P
  13860.  2901    X(I) = 5.D-1
  13861.       GO TO 9999
  13862. C
  13863. C
  13864.  9999 RETURN
  13865.       END
  13866.  
  13867.  
  13868.